<!DOCTYPE html><html lang="zh-cmn-Hans"><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<style type="text/css">
.anim-fade-in{-webkit-animation-name:fade-in;animation-name:fade-in;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.anim-fade-in.fast{-webkit-animation-duration:300ms;animation-duration:300ms}@-webkit-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.anim-fade-up{opacity:0;-webkit-animation-name:fade-up;animation-name:fade-up;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes fade-up{0%{opacity:0.8;-webkit-transform:translateY(100%);transform:translateY(100%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fade-up{0%{opacity:0.8;-webkit-transform:translateY(100%);transform:translateY(100%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.anim-fade-down{-webkit-animation-name:fade-down;animation-name:fade-down;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes fade-down{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0.5;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes fade-down{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0.5;-webkit-transform:translateY(100%);transform:translateY(100%)}}.anim-grow-x{width:0%;-webkit-animation-name:grow-x;animation-name:grow-x;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-delay:0.5s;animation-delay:0.5s}@-webkit-keyframes grow-x{to{width:100%}}@keyframes grow-x{to{width:100%}}.anim-shrink-x{-webkit-animation-name:shrink-x;animation-name:shrink-x;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-delay:0.5s;animation-delay:0.5s}@-webkit-keyframes shrink-x{to{width:0%}}@keyframes shrink-x{to{width:0%}}.anim-scale-in{-webkit-animation-name:scale-in;animation-name:scale-in;-webkit-animation-duration:0.15s;animation-duration:0.15s;-webkit-animation-timing-function:cubic-bezier(0.2, 0, 0.13, 1.5);animation-timing-function:cubic-bezier(0.2, 0, 0.13, 1.5)}@-webkit-keyframes scale-in{0%{opacity:0;-webkit-transform:scale(0.5);transform:scale(0.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes scale-in{0%{opacity:0;-webkit-transform:scale(0.5);transform:scale(0.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.anim-pulse{-webkit-animation-name:pulse;animation-name:pulse;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes pulse{0%{opacity:0.3}10%{opacity:1}100%{opacity:0.3}}@keyframes pulse{0%{opacity:0.3}10%{opacity:1}100%{opacity:0.3}}.anim-pulse-in{-webkit-animation-name:pulse-in;animation-name:pulse-in;-webkit-animation-duration:0.5s;animation-duration:0.5s}@-webkit-keyframes pulse-in{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes pulse-in{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.border{border:1px #e1e4e8 solid !important}.border-top{border-top:1px #e1e4e8 solid !important}.border-right{border-right:1px #e1e4e8 solid !important}.border-bottom{border-bottom:1px #e1e4e8 solid !important}.border-left{border-left:1px #e1e4e8 solid !important}.border-y{border-top:1px #e1e4e8 solid !important;border-bottom:1px #e1e4e8 solid !important}.border-dashed{border-style:dashed !important}.border-blue{border-color:#0366d6 !important}.border-blue-light{border-color:#c8e1ff !important}.border-green{border-color:#34d058 !important}.border-green-light{border-color:#a2cbac !important}.border-red{border-color:#d73a49 !important}.border-red-light{border-color:#cea0a5 !important}.border-purple{border-color:#6f42c1 !important}.border-yellow{border-color:#d9d0a5 !important}.border-gray-light{border-color:#eaecef !important}.border-gray-dark{border-color:#d1d5da !important}.border-black-fade{border-color:rgba(27,31,35,0.15) !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:3px !important}.rounded-2{border-radius:6px !important}.box-shadow{box-shadow:0 1px 1px rgba(0,0,0,0.1) !important}.box-shadow-medium{box-shadow:0 1px 5px rgba(0,0,0,0.15) !important}.box-shadow-large{box-shadow:0 1px 15px rgba(0,0,0,0.15) !important}.box-shadow-extra-large{box-shadow:0 10px 50px rgba(0,0,0,0.07) !important}.box-shadow-none{box-shadow:none !important}.bg-white{background-color:#fff !important}.bg-blue{background-color:#0366d6 !important}.bg-blue-light{background-color:#f1f8ff !important}.bg-gray-dark{background-color:#24292e !important}.bg-gray{background-color:#f6f8fa !important}.bg-gray-light{background-color:#fafbfc !important}.bg-green{background-color:#28a745 !important}.bg-green-light{background-color:#dcffe4 !important}.bg-red{background-color:#d73a49 !important}.bg-red-light{background-color:#ffdce0 !important}.bg-yellow{background-color:#ffd33d !important}.bg-yellow-light{background-color:#fff5b1 !important}.bg-purple{background-color:#6f42c1 !important}.bg-purple-light{background-color:#f5f0ff !important}.bg-shade-gradient{background-image:-webkit-linear-gradient(270deg, rgba(0,0,0,0.065), transparent) !important;background-image:linear-gradient(180deg, rgba(0,0,0,0.065), transparent) !important;background-repeat:no-repeat !important;background-size:100% 200px !important}.text-blue{color:#0366d6 !important}.text-red{color:#cb2431 !important}.text-gray-light{color:#6a737d !important}.text-gray{color:#586069 !important}.text-gray-dark{color:#24292e !important}.text-green{color:#28a745 !important}.text-orange{color:#a04100 !important}.text-orange-light{color:#e36209 !important}.text-purple{color:#6f42c1 !important}.text-white{color:#fff !important}.text-inherit{color:inherit !important}.text-pending{color:#b08800 !important}.bg-pending{color:#dbab09 !important}.link-gray{color:#586069 !important}.link-gray:hover{color:#0366d6 !important}.link-gray-dark{color:#24292e !important}.link-gray-dark:hover{color:#0366d6 !important}.link-hover-blue:hover{color:#0366d6 !important}.muted-link{color:#586069 !important}.muted-link:hover{color:#0366d6 !important;text-decoration:none}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}@media (min-width: 544px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-sm-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-sm-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-sm-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-sm-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-sm-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-sm-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-sm-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-sm-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-sm-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-sm-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-sm-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-sm-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-sm-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-sm-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-sm-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-sm-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-sm-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-sm-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-sm-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-sm-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-sm-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-sm-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-sm-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-sm-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-sm-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-md-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-md-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-md-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-md-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-md-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-md-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-md-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-md-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-md-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-md-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-md-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-md-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-md-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-md-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-md-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-md-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-md-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-md-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-md-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-md-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-md-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-md-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-md-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-md-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-md-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 1012px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-lg-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-lg-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-lg-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-lg-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-lg-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-lg-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-lg-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-lg-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-lg-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-lg-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-lg-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-lg-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-lg-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-lg-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-lg-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-lg-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-lg-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-lg-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-lg-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-lg-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-lg-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-lg-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-lg-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-lg-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-lg-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 1280px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-xl-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-xl-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-xl-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-xl-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-xl-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-xl-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-xl-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-xl-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-xl-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-xl-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-xl-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-xl-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-xl-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-xl-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-xl-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-xl-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-xl-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-xl-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-xl-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-xl-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-xl-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-xl-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-xl-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-xl-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-xl-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.top-0{top:0 !important}.right-0{right:0 !important}.bottom-0{bottom:0 !important}.left-0{left:0 !important}.v-align-middle{vertical-align:middle !important}.v-align-top{vertical-align:top !important}.v-align-bottom{vertical-align:bottom !important}.v-align-text-top{vertical-align:text-top !important}.v-align-text-bottom{vertical-align:text-bottom !important}.overflow-hidden{overflow:hidden !important}.overflow-scroll{overflow:scroll !important}.overflow-auto{overflow:auto !important}.clearfix::before{display:table;content:""}.clearfix::after{display:table;clear:both;content:""}.float-right{float:right !important}.float-left{float:left !important}.float-none{float:none !important}@media (min-width: 544px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 1012px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1280px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.width-fit{max-width:100% !important}.width-full{width:100% !important}.height-full{height:100% !important}.min-width-0{min-width:0 !important}.direction-rtl{direction:rtl !important}.direction-ltr{direction:ltr !important}@media (min-width: 544px){.direction-sm-rtl{direction:rtl !important}.direction-sm-ltr{direction:ltr !important}}@media (min-width: 768px){.direction-md-rtl{direction:rtl !important}.direction-md-ltr{direction:ltr !important}}@media (min-width: 1012px){.direction-lg-rtl{direction:rtl !important}.direction-lg-ltr{direction:ltr !important}}@media (min-width: 1280px){.direction-xl-rtl{direction:rtl !important}.direction-xl-ltr{direction:ltr !important}}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mt-n0{margin-top:-0 !important}.mr-n0{margin-right:-0 !important}.mb-n0{margin-bottom:-0 !important}.ml-n0{margin-left:-0 !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:4px !important}.mt-1{margin-top:4px !important}.mr-1{margin-right:4px !important}.mb-1{margin-bottom:4px !important}.ml-1{margin-left:4px !important}.mt-n1{margin-top:-4px !important}.mr-n1{margin-right:-4px !important}.mb-n1{margin-bottom:-4px !important}.ml-n1{margin-left:-4px !important}.mx-1{margin-right:4px !important;margin-left:4px !important}.my-1{margin-top:4px !important;margin-bottom:4px !important}.m-2{margin:8px !important}.mt-2{margin-top:8px !important}.mr-2{margin-right:8px !important}.mb-2{margin-bottom:8px !important}.ml-2{margin-left:8px !important}.mt-n2{margin-top:-8px !important}.mr-n2{margin-right:-8px !important}.mb-n2{margin-bottom:-8px !important}.ml-n2{margin-left:-8px !important}.mx-2{margin-right:8px !important;margin-left:8px !important}.my-2{margin-top:8px !important;margin-bottom:8px !important}.m-3{margin:16px !important}.mt-3{margin-top:16px !important}.mr-3{margin-right:16px !important}.mb-3{margin-bottom:16px !important}.ml-3{margin-left:16px !important}.mt-n3{margin-top:-16px !important}.mr-n3{margin-right:-16px !important}.mb-n3{margin-bottom:-16px !important}.ml-n3{margin-left:-16px !important}.mx-3{margin-right:16px !important;margin-left:16px !important}.my-3{margin-top:16px !important;margin-bottom:16px !important}.m-4{margin:24px !important}.mt-4{margin-top:24px !important}.mr-4{margin-right:24px !important}.mb-4{margin-bottom:24px !important}.ml-4{margin-left:24px !important}.mt-n4{margin-top:-24px !important}.mr-n4{margin-right:-24px !important}.mb-n4{margin-bottom:-24px !important}.ml-n4{margin-left:-24px !important}.mx-4{margin-right:24px !important;margin-left:24px !important}.my-4{margin-top:24px !important;margin-bottom:24px !important}.m-5{margin:32px !important}.mt-5{margin-top:32px !important}.mr-5{margin-right:32px !important}.mb-5{margin-bottom:32px !important}.ml-5{margin-left:32px !important}.mt-n5{margin-top:-32px !important}.mr-n5{margin-right:-32px !important}.mb-n5{margin-bottom:-32px !important}.ml-n5{margin-left:-32px !important}.mx-5{margin-right:32px !important;margin-left:32px !important}.my-5{margin-top:32px !important;margin-bottom:32px !important}.m-6{margin:40px !important}.mt-6{margin-top:40px !important}.mr-6{margin-right:40px !important}.mb-6{margin-bottom:40px !important}.ml-6{margin-left:40px !important}.mt-n6{margin-top:-40px !important}.mr-n6{margin-right:-40px !important}.mb-n6{margin-bottom:-40px !important}.ml-n6{margin-left:-40px !important}.mx-6{margin-right:40px !important;margin-left:40px !important}.my-6{margin-top:40px !important;margin-bottom:40px !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}@media (min-width: 544px){.m-sm-0{margin:0 !important}.mt-sm-0{margin-top:0 !important}.mr-sm-0{margin-right:0 !important}.mb-sm-0{margin-bottom:0 !important}.ml-sm-0{margin-left:0 !important}.mt-sm-n0{margin-top:-0 !important}.mr-sm-n0{margin-right:-0 !important}.mb-sm-n0{margin-bottom:-0 !important}.ml-sm-n0{margin-left:-0 !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 544px){.m-sm-1{margin:4px !important}.mt-sm-1{margin-top:4px !important}.mr-sm-1{margin-right:4px !important}.mb-sm-1{margin-bottom:4px !important}.ml-sm-1{margin-left:4px !important}.mt-sm-n1{margin-top:-4px !important}.mr-sm-n1{margin-right:-4px !important}.mb-sm-n1{margin-bottom:-4px !important}.ml-sm-n1{margin-left:-4px !important}.mx-sm-1{margin-right:4px !important;margin-left:4px !important}.my-sm-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 544px){.m-sm-2{margin:8px !important}.mt-sm-2{margin-top:8px !important}.mr-sm-2{margin-right:8px !important}.mb-sm-2{margin-bottom:8px !important}.ml-sm-2{margin-left:8px !important}.mt-sm-n2{margin-top:-8px !important}.mr-sm-n2{margin-right:-8px !important}.mb-sm-n2{margin-bottom:-8px !important}.ml-sm-n2{margin-left:-8px !important}.mx-sm-2{margin-right:8px !important;margin-left:8px !important}.my-sm-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 544px){.m-sm-3{margin:16px !important}.mt-sm-3{margin-top:16px !important}.mr-sm-3{margin-right:16px !important}.mb-sm-3{margin-bottom:16px !important}.ml-sm-3{margin-left:16px !important}.mt-sm-n3{margin-top:-16px !important}.mr-sm-n3{margin-right:-16px !important}.mb-sm-n3{margin-bottom:-16px !important}.ml-sm-n3{margin-left:-16px !important}.mx-sm-3{margin-right:16px !important;margin-left:16px !important}.my-sm-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 544px){.m-sm-4{margin:24px !important}.mt-sm-4{margin-top:24px !important}.mr-sm-4{margin-right:24px !important}.mb-sm-4{margin-bottom:24px !important}.ml-sm-4{margin-left:24px !important}.mt-sm-n4{margin-top:-24px !important}.mr-sm-n4{margin-right:-24px !important}.mb-sm-n4{margin-bottom:-24px !important}.ml-sm-n4{margin-left:-24px !important}.mx-sm-4{margin-right:24px !important;margin-left:24px !important}.my-sm-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 544px){.m-sm-5{margin:32px !important}.mt-sm-5{margin-top:32px !important}.mr-sm-5{margin-right:32px !important}.mb-sm-5{margin-bottom:32px !important}.ml-sm-5{margin-left:32px !important}.mt-sm-n5{margin-top:-32px !important}.mr-sm-n5{margin-right:-32px !important}.mb-sm-n5{margin-bottom:-32px !important}.ml-sm-n5{margin-left:-32px !important}.mx-sm-5{margin-right:32px !important;margin-left:32px !important}.my-sm-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 544px){.m-sm-6{margin:40px !important}.mt-sm-6{margin-top:40px !important}.mr-sm-6{margin-right:40px !important}.mb-sm-6{margin-bottom:40px !important}.ml-sm-6{margin-left:40px !important}.mt-sm-n6{margin-top:-40px !important}.mr-sm-n6{margin-right:-40px !important}.mb-sm-n6{margin-bottom:-40px !important}.ml-sm-n6{margin-left:-40px !important}.mx-sm-6{margin-right:40px !important;margin-left:40px !important}.my-sm-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0{margin-top:0 !important}.mr-md-0{margin-right:0 !important}.mb-md-0{margin-bottom:0 !important}.ml-md-0{margin-left:0 !important}.mt-md-n0{margin-top:-0 !important}.mr-md-n0{margin-right:-0 !important}.mb-md-n0{margin-bottom:-0 !important}.ml-md-n0{margin-left:-0 !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 768px){.m-md-1{margin:4px !important}.mt-md-1{margin-top:4px !important}.mr-md-1{margin-right:4px !important}.mb-md-1{margin-bottom:4px !important}.ml-md-1{margin-left:4px !important}.mt-md-n1{margin-top:-4px !important}.mr-md-n1{margin-right:-4px !important}.mb-md-n1{margin-bottom:-4px !important}.ml-md-n1{margin-left:-4px !important}.mx-md-1{margin-right:4px !important;margin-left:4px !important}.my-md-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 768px){.m-md-2{margin:8px !important}.mt-md-2{margin-top:8px !important}.mr-md-2{margin-right:8px !important}.mb-md-2{margin-bottom:8px !important}.ml-md-2{margin-left:8px !important}.mt-md-n2{margin-top:-8px !important}.mr-md-n2{margin-right:-8px !important}.mb-md-n2{margin-bottom:-8px !important}.ml-md-n2{margin-left:-8px !important}.mx-md-2{margin-right:8px !important;margin-left:8px !important}.my-md-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 768px){.m-md-3{margin:16px !important}.mt-md-3{margin-top:16px !important}.mr-md-3{margin-right:16px !important}.mb-md-3{margin-bottom:16px !important}.ml-md-3{margin-left:16px !important}.mt-md-n3{margin-top:-16px !important}.mr-md-n3{margin-right:-16px !important}.mb-md-n3{margin-bottom:-16px !important}.ml-md-n3{margin-left:-16px !important}.mx-md-3{margin-right:16px !important;margin-left:16px !important}.my-md-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 768px){.m-md-4{margin:24px !important}.mt-md-4{margin-top:24px !important}.mr-md-4{margin-right:24px !important}.mb-md-4{margin-bottom:24px !important}.ml-md-4{margin-left:24px !important}.mt-md-n4{margin-top:-24px !important}.mr-md-n4{margin-right:-24px !important}.mb-md-n4{margin-bottom:-24px !important}.ml-md-n4{margin-left:-24px !important}.mx-md-4{margin-right:24px !important;margin-left:24px !important}.my-md-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 768px){.m-md-5{margin:32px !important}.mt-md-5{margin-top:32px !important}.mr-md-5{margin-right:32px !important}.mb-md-5{margin-bottom:32px !important}.ml-md-5{margin-left:32px !important}.mt-md-n5{margin-top:-32px !important}.mr-md-n5{margin-right:-32px !important}.mb-md-n5{margin-bottom:-32px !important}.ml-md-n5{margin-left:-32px !important}.mx-md-5{margin-right:32px !important;margin-left:32px !important}.my-md-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 768px){.m-md-6{margin:40px !important}.mt-md-6{margin-top:40px !important}.mr-md-6{margin-right:40px !important}.mb-md-6{margin-bottom:40px !important}.ml-md-6{margin-left:40px !important}.mt-md-n6{margin-top:-40px !important}.mr-md-n6{margin-right:-40px !important}.mb-md-n6{margin-bottom:-40px !important}.ml-md-n6{margin-left:-40px !important}.mx-md-6{margin-right:40px !important;margin-left:40px !important}.my-md-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 1012px){.m-lg-0{margin:0 !important}.mt-lg-0{margin-top:0 !important}.mr-lg-0{margin-right:0 !important}.mb-lg-0{margin-bottom:0 !important}.ml-lg-0{margin-left:0 !important}.mt-lg-n0{margin-top:-0 !important}.mr-lg-n0{margin-right:-0 !important}.mb-lg-n0{margin-bottom:-0 !important}.ml-lg-n0{margin-left:-0 !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 1012px){.m-lg-1{margin:4px !important}.mt-lg-1{margin-top:4px !important}.mr-lg-1{margin-right:4px !important}.mb-lg-1{margin-bottom:4px !important}.ml-lg-1{margin-left:4px !important}.mt-lg-n1{margin-top:-4px !important}.mr-lg-n1{margin-right:-4px !important}.mb-lg-n1{margin-bottom:-4px !important}.ml-lg-n1{margin-left:-4px !important}.mx-lg-1{margin-right:4px !important;margin-left:4px !important}.my-lg-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 1012px){.m-lg-2{margin:8px !important}.mt-lg-2{margin-top:8px !important}.mr-lg-2{margin-right:8px !important}.mb-lg-2{margin-bottom:8px !important}.ml-lg-2{margin-left:8px !important}.mt-lg-n2{margin-top:-8px !important}.mr-lg-n2{margin-right:-8px !important}.mb-lg-n2{margin-bottom:-8px !important}.ml-lg-n2{margin-left:-8px !important}.mx-lg-2{margin-right:8px !important;margin-left:8px !important}.my-lg-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 1012px){.m-lg-3{margin:16px !important}.mt-lg-3{margin-top:16px !important}.mr-lg-3{margin-right:16px !important}.mb-lg-3{margin-bottom:16px !important}.ml-lg-3{margin-left:16px !important}.mt-lg-n3{margin-top:-16px !important}.mr-lg-n3{margin-right:-16px !important}.mb-lg-n3{margin-bottom:-16px !important}.ml-lg-n3{margin-left:-16px !important}.mx-lg-3{margin-right:16px !important;margin-left:16px !important}.my-lg-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 1012px){.m-lg-4{margin:24px !important}.mt-lg-4{margin-top:24px !important}.mr-lg-4{margin-right:24px !important}.mb-lg-4{margin-bottom:24px !important}.ml-lg-4{margin-left:24px !important}.mt-lg-n4{margin-top:-24px !important}.mr-lg-n4{margin-right:-24px !important}.mb-lg-n4{margin-bottom:-24px !important}.ml-lg-n4{margin-left:-24px !important}.mx-lg-4{margin-right:24px !important;margin-left:24px !important}.my-lg-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 1012px){.m-lg-5{margin:32px !important}.mt-lg-5{margin-top:32px !important}.mr-lg-5{margin-right:32px !important}.mb-lg-5{margin-bottom:32px !important}.ml-lg-5{margin-left:32px !important}.mt-lg-n5{margin-top:-32px !important}.mr-lg-n5{margin-right:-32px !important}.mb-lg-n5{margin-bottom:-32px !important}.ml-lg-n5{margin-left:-32px !important}.mx-lg-5{margin-right:32px !important;margin-left:32px !important}.my-lg-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 1012px){.m-lg-6{margin:40px !important}.mt-lg-6{margin-top:40px !important}.mr-lg-6{margin-right:40px !important}.mb-lg-6{margin-bottom:40px !important}.ml-lg-6{margin-left:40px !important}.mt-lg-n6{margin-top:-40px !important}.mr-lg-n6{margin-right:-40px !important}.mb-lg-n6{margin-bottom:-40px !important}.ml-lg-n6{margin-left:-40px !important}.mx-lg-6{margin-right:40px !important;margin-left:40px !important}.my-lg-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 1280px){.m-xl-0{margin:0 !important}.mt-xl-0{margin-top:0 !important}.mr-xl-0{margin-right:0 !important}.mb-xl-0{margin-bottom:0 !important}.ml-xl-0{margin-left:0 !important}.mt-xl-n0{margin-top:-0 !important}.mr-xl-n0{margin-right:-0 !important}.mb-xl-n0{margin-bottom:-0 !important}.ml-xl-n0{margin-left:-0 !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 1280px){.m-xl-1{margin:4px !important}.mt-xl-1{margin-top:4px !important}.mr-xl-1{margin-right:4px !important}.mb-xl-1{margin-bottom:4px !important}.ml-xl-1{margin-left:4px !important}.mt-xl-n1{margin-top:-4px !important}.mr-xl-n1{margin-right:-4px !important}.mb-xl-n1{margin-bottom:-4px !important}.ml-xl-n1{margin-left:-4px !important}.mx-xl-1{margin-right:4px !important;margin-left:4px !important}.my-xl-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 1280px){.m-xl-2{margin:8px !important}.mt-xl-2{margin-top:8px !important}.mr-xl-2{margin-right:8px !important}.mb-xl-2{margin-bottom:8px !important}.ml-xl-2{margin-left:8px !important}.mt-xl-n2{margin-top:-8px !important}.mr-xl-n2{margin-right:-8px !important}.mb-xl-n2{margin-bottom:-8px !important}.ml-xl-n2{margin-left:-8px !important}.mx-xl-2{margin-right:8px !important;margin-left:8px !important}.my-xl-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 1280px){.m-xl-3{margin:16px !important}.mt-xl-3{margin-top:16px !important}.mr-xl-3{margin-right:16px !important}.mb-xl-3{margin-bottom:16px !important}.ml-xl-3{margin-left:16px !important}.mt-xl-n3{margin-top:-16px !important}.mr-xl-n3{margin-right:-16px !important}.mb-xl-n3{margin-bottom:-16px !important}.ml-xl-n3{margin-left:-16px !important}.mx-xl-3{margin-right:16px !important;margin-left:16px !important}.my-xl-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 1280px){.m-xl-4{margin:24px !important}.mt-xl-4{margin-top:24px !important}.mr-xl-4{margin-right:24px !important}.mb-xl-4{margin-bottom:24px !important}.ml-xl-4{margin-left:24px !important}.mt-xl-n4{margin-top:-24px !important}.mr-xl-n4{margin-right:-24px !important}.mb-xl-n4{margin-bottom:-24px !important}.ml-xl-n4{margin-left:-24px !important}.mx-xl-4{margin-right:24px !important;margin-left:24px !important}.my-xl-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 1280px){.m-xl-5{margin:32px !important}.mt-xl-5{margin-top:32px !important}.mr-xl-5{margin-right:32px !important}.mb-xl-5{margin-bottom:32px !important}.ml-xl-5{margin-left:32px !important}.mt-xl-n5{margin-top:-32px !important}.mr-xl-n5{margin-right:-32px !important}.mb-xl-n5{margin-bottom:-32px !important}.ml-xl-n5{margin-left:-32px !important}.mx-xl-5{margin-right:32px !important;margin-left:32px !important}.my-xl-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 1280px){.m-xl-6{margin:40px !important}.mt-xl-6{margin-top:40px !important}.mr-xl-6{margin-right:40px !important}.mb-xl-6{margin-bottom:40px !important}.ml-xl-6{margin-left:40px !important}.mt-xl-n6{margin-top:-40px !important}.mr-xl-n6{margin-right:-40px !important}.mb-xl-n6{margin-bottom:-40px !important}.ml-xl-n6{margin-left:-40px !important}.mx-xl-6{margin-right:40px !important;margin-left:40px !important}.my-xl-6{margin-top:40px !important;margin-bottom:40px !important}}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-right:0 !important;padding-left:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:4px !important}.pt-1{padding-top:4px !important}.pr-1{padding-right:4px !important}.pb-1{padding-bottom:4px !important}.pl-1{padding-left:4px !important}.px-1{padding-right:4px !important;padding-left:4px !important}.py-1{padding-top:4px !important;padding-bottom:4px !important}.p-2{padding:8px !important}.pt-2{padding-top:8px !important}.pr-2{padding-right:8px !important}.pb-2{padding-bottom:8px !important}.pl-2{padding-left:8px !important}.px-2{padding-right:8px !important;padding-left:8px !important}.py-2{padding-top:8px !important;padding-bottom:8px !important}.p-3{padding:16px !important}.pt-3{padding-top:16px !important}.pr-3{padding-right:16px !important}.pb-3{padding-bottom:16px !important}.pl-3{padding-left:16px !important}.px-3{padding-right:16px !important;padding-left:16px !important}.py-3{padding-top:16px !important;padding-bottom:16px !important}.p-4{padding:24px !important}.pt-4{padding-top:24px !important}.pr-4{padding-right:24px !important}.pb-4{padding-bottom:24px !important}.pl-4{padding-left:24px !important}.px-4{padding-right:24px !important;padding-left:24px !important}.py-4{padding-top:24px !important;padding-bottom:24px !important}.p-5{padding:32px !important}.pt-5{padding-top:32px !important}.pr-5{padding-right:32px !important}.pb-5{padding-bottom:32px !important}.pl-5{padding-left:32px !important}.px-5{padding-right:32px !important;padding-left:32px !important}.py-5{padding-top:32px !important;padding-bottom:32px !important}.p-6{padding:40px !important}.pt-6{padding-top:40px !important}.pr-6{padding-right:40px !important}.pb-6{padding-bottom:40px !important}.pl-6{padding-left:40px !important}.px-6{padding-right:40px !important;padding-left:40px !important}.py-6{padding-top:40px !important;padding-bottom:40px !important}@media (min-width: 544px){.p-sm-0{padding:0 !important}.pt-sm-0{padding-top:0 !important}.pr-sm-0{padding-right:0 !important}.pb-sm-0{padding-bottom:0 !important}.pl-sm-0{padding-left:0 !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 544px){.p-sm-1{padding:4px !important}.pt-sm-1{padding-top:4px !important}.pr-sm-1{padding-right:4px !important}.pb-sm-1{padding-bottom:4px !important}.pl-sm-1{padding-left:4px !important}.px-sm-1{padding-right:4px !important;padding-left:4px !important}.py-sm-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 544px){.p-sm-2{padding:8px !important}.pt-sm-2{padding-top:8px !important}.pr-sm-2{padding-right:8px !important}.pb-sm-2{padding-bottom:8px !important}.pl-sm-2{padding-left:8px !important}.px-sm-2{padding-right:8px !important;padding-left:8px !important}.py-sm-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 544px){.p-sm-3{padding:16px !important}.pt-sm-3{padding-top:16px !important}.pr-sm-3{padding-right:16px !important}.pb-sm-3{padding-bottom:16px !important}.pl-sm-3{padding-left:16px !important}.px-sm-3{padding-right:16px !important;padding-left:16px !important}.py-sm-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 544px){.p-sm-4{padding:24px !important}.pt-sm-4{padding-top:24px !important}.pr-sm-4{padding-right:24px !important}.pb-sm-4{padding-bottom:24px !important}.pl-sm-4{padding-left:24px !important}.px-sm-4{padding-right:24px !important;padding-left:24px !important}.py-sm-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 544px){.p-sm-5{padding:32px !important}.pt-sm-5{padding-top:32px !important}.pr-sm-5{padding-right:32px !important}.pb-sm-5{padding-bottom:32px !important}.pl-sm-5{padding-left:32px !important}.px-sm-5{padding-right:32px !important;padding-left:32px !important}.py-sm-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 544px){.p-sm-6{padding:40px !important}.pt-sm-6{padding-top:40px !important}.pr-sm-6{padding-right:40px !important}.pb-sm-6{padding-bottom:40px !important}.pl-sm-6{padding-left:40px !important}.px-sm-6{padding-right:40px !important;padding-left:40px !important}.py-sm-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 768px){.p-md-0{padding:0 !important}.pt-md-0{padding-top:0 !important}.pr-md-0{padding-right:0 !important}.pb-md-0{padding-bottom:0 !important}.pl-md-0{padding-left:0 !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 768px){.p-md-1{padding:4px !important}.pt-md-1{padding-top:4px !important}.pr-md-1{padding-right:4px !important}.pb-md-1{padding-bottom:4px !important}.pl-md-1{padding-left:4px !important}.px-md-1{padding-right:4px !important;padding-left:4px !important}.py-md-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 768px){.p-md-2{padding:8px !important}.pt-md-2{padding-top:8px !important}.pr-md-2{padding-right:8px !important}.pb-md-2{padding-bottom:8px !important}.pl-md-2{padding-left:8px !important}.px-md-2{padding-right:8px !important;padding-left:8px !important}.py-md-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 768px){.p-md-3{padding:16px !important}.pt-md-3{padding-top:16px !important}.pr-md-3{padding-right:16px !important}.pb-md-3{padding-bottom:16px !important}.pl-md-3{padding-left:16px !important}.px-md-3{padding-right:16px !important;padding-left:16px !important}.py-md-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 768px){.p-md-4{padding:24px !important}.pt-md-4{padding-top:24px !important}.pr-md-4{padding-right:24px !important}.pb-md-4{padding-bottom:24px !important}.pl-md-4{padding-left:24px !important}.px-md-4{padding-right:24px !important;padding-left:24px !important}.py-md-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 768px){.p-md-5{padding:32px !important}.pt-md-5{padding-top:32px !important}.pr-md-5{padding-right:32px !important}.pb-md-5{padding-bottom:32px !important}.pl-md-5{padding-left:32px !important}.px-md-5{padding-right:32px !important;padding-left:32px !important}.py-md-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 768px){.p-md-6{padding:40px !important}.pt-md-6{padding-top:40px !important}.pr-md-6{padding-right:40px !important}.pb-md-6{padding-bottom:40px !important}.pl-md-6{padding-left:40px !important}.px-md-6{padding-right:40px !important;padding-left:40px !important}.py-md-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 1012px){.p-lg-0{padding:0 !important}.pt-lg-0{padding-top:0 !important}.pr-lg-0{padding-right:0 !important}.pb-lg-0{padding-bottom:0 !important}.pl-lg-0{padding-left:0 !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 1012px){.p-lg-1{padding:4px !important}.pt-lg-1{padding-top:4px !important}.pr-lg-1{padding-right:4px !important}.pb-lg-1{padding-bottom:4px !important}.pl-lg-1{padding-left:4px !important}.px-lg-1{padding-right:4px !important;padding-left:4px !important}.py-lg-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 1012px){.p-lg-2{padding:8px !important}.pt-lg-2{padding-top:8px !important}.pr-lg-2{padding-right:8px !important}.pb-lg-2{padding-bottom:8px !important}.pl-lg-2{padding-left:8px !important}.px-lg-2{padding-right:8px !important;padding-left:8px !important}.py-lg-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 1012px){.p-lg-3{padding:16px !important}.pt-lg-3{padding-top:16px !important}.pr-lg-3{padding-right:16px !important}.pb-lg-3{padding-bottom:16px !important}.pl-lg-3{padding-left:16px !important}.px-lg-3{padding-right:16px !important;padding-left:16px !important}.py-lg-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 1012px){.p-lg-4{padding:24px !important}.pt-lg-4{padding-top:24px !important}.pr-lg-4{padding-right:24px !important}.pb-lg-4{padding-bottom:24px !important}.pl-lg-4{padding-left:24px !important}.px-lg-4{padding-right:24px !important;padding-left:24px !important}.py-lg-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 1012px){.p-lg-5{padding:32px !important}.pt-lg-5{padding-top:32px !important}.pr-lg-5{padding-right:32px !important}.pb-lg-5{padding-bottom:32px !important}.pl-lg-5{padding-left:32px !important}.px-lg-5{padding-right:32px !important;padding-left:32px !important}.py-lg-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 1012px){.p-lg-6{padding:40px !important}.pt-lg-6{padding-top:40px !important}.pr-lg-6{padding-right:40px !important}.pb-lg-6{padding-bottom:40px !important}.pl-lg-6{padding-left:40px !important}.px-lg-6{padding-right:40px !important;padding-left:40px !important}.py-lg-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 1280px){.p-xl-0{padding:0 !important}.pt-xl-0{padding-top:0 !important}.pr-xl-0{padding-right:0 !important}.pb-xl-0{padding-bottom:0 !important}.pl-xl-0{padding-left:0 !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 1280px){.p-xl-1{padding:4px !important}.pt-xl-1{padding-top:4px !important}.pr-xl-1{padding-right:4px !important}.pb-xl-1{padding-bottom:4px !important}.pl-xl-1{padding-left:4px !important}.px-xl-1{padding-right:4px !important;padding-left:4px !important}.py-xl-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 1280px){.p-xl-2{padding:8px !important}.pt-xl-2{padding-top:8px !important}.pr-xl-2{padding-right:8px !important}.pb-xl-2{padding-bottom:8px !important}.pl-xl-2{padding-left:8px !important}.px-xl-2{padding-right:8px !important;padding-left:8px !important}.py-xl-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 1280px){.p-xl-3{padding:16px !important}.pt-xl-3{padding-top:16px !important}.pr-xl-3{padding-right:16px !important}.pb-xl-3{padding-bottom:16px !important}.pl-xl-3{padding-left:16px !important}.px-xl-3{padding-right:16px !important;padding-left:16px !important}.py-xl-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 1280px){.p-xl-4{padding:24px !important}.pt-xl-4{padding-top:24px !important}.pr-xl-4{padding-right:24px !important}.pb-xl-4{padding-bottom:24px !important}.pl-xl-4{padding-left:24px !important}.px-xl-4{padding-right:24px !important;padding-left:24px !important}.py-xl-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 1280px){.p-xl-5{padding:32px !important}.pt-xl-5{padding-top:32px !important}.pr-xl-5{padding-right:32px !important}.pb-xl-5{padding-bottom:32px !important}.pl-xl-5{padding-left:32px !important}.px-xl-5{padding-right:32px !important;padding-left:32px !important}.py-xl-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 1280px){.p-xl-6{padding:40px !important}.pt-xl-6{padding-top:40px !important}.pr-xl-6{padding-right:40px !important}.pb-xl-6{padding-bottom:40px !important}.pl-xl-6{padding-left:40px !important}.px-xl-6{padding-right:40px !important;padding-left:40px !important}.py-xl-6{padding-top:40px !important;padding-bottom:40px !important}}.h1{font-size:26px !important}@media (min-width: 768px){.h1{font-size:32px !important}}.h2{font-size:22px !important}@media (min-width: 768px){.h2{font-size:24px !important}}.h3{font-size:18px !important}@media (min-width: 768px){.h3{font-size:20px !important}}.h4{font-size:16px !important}.h5{font-size:14px !important}.h6{font-size:12px !important}.h1,.h2,.h3,.h4,.h5,.h6{font-weight:600 !important}.f1{font-size:26px !important}@media (min-width: 768px){.f1{font-size:32px !important}}.f2{font-size:22px !important}@media (min-width: 768px){.f2{font-size:24px !important}}.f3{font-size:18px !important}@media (min-width: 768px){.f3{font-size:20px !important}}.f4{font-size:16px !important}@media (min-width: 768px){.f4{font-size:16px !important}}.f5{font-size:14px !important}.f6{font-size:12px !important}.f00-light{font-size:40px !important;font-weight:300 !important}@media (min-width: 768px){.f00-light{font-size:48px !important}}.f0-light{font-size:32px !important;font-weight:300 !important}@media (min-width: 768px){.f0-light{font-size:40px !important}}.f1-light{font-size:26px !important;font-weight:300 !important}@media (min-width: 768px){.f1-light{font-size:32px !important}}.f2-light{font-size:22px !important;font-weight:300 !important}@media (min-width: 768px){.f2-light{font-size:24px !important}}.f3-light{font-size:18px !important;font-weight:300 !important}@media (min-width: 768px){.f3-light{font-size:20px !important}}.text-small{font-size:12px !important}.lead{margin-bottom:30px;font-size:20px;font-weight:300;color:#555}.lh-condensed-ultra{line-height:1 !important}.lh-condensed{line-height:1.25 !important}.lh-default{line-height:1.5 !important}.text-right{text-align:right !important}.text-left{text-align:left !important}.text-center{text-align:center !important}@media (min-width: 544px){.text-sm-right{text-align:right !important}.text-sm-left{text-align:left !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-right{text-align:right !important}.text-md-left{text-align:left !important}.text-md-center{text-align:center !important}}@media (min-width: 1012px){.text-lg-right{text-align:right !important}.text-lg-left{text-align:left !important}.text-lg-center{text-align:center !important}}@media (min-width: 1280px){.text-xl-right{text-align:right !important}.text-xl-left{text-align:left !important}.text-xl-center{text-align:center !important}}.text-normal{font-weight:normal !important}.text-bold{font-weight:600 !important}.text-italic{font-style:italic !important}.text-uppercase{text-transform:uppercase !important}.no-underline{text-decoration:none !important}.no-wrap{white-space:nowrap !important}.ws-normal{white-space:normal !important}.wb-break-all{word-break:break-all !important}.text-emphasized{font-weight:600;color:#24292e}.list-style-none{list-style:none !important}.text-shadow-dark{text-shadow:0 1px 1px rgba(0,0,0,0.25),0 1px 25px rgba(0,0,0,0.75)}.text-shadow-light{text-shadow:0 1px 0 rgba(255,255,255,0.5)}.v-hidden{visibility:hidden !important}.v-visible{visibility:visible !important}.d-table{display:table !important}.d-table-cell{display:table-cell !important}.table-fixed{table-layout:fixed !important}.d-block{display:block !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-none{display:none !important}@media (min-width: 544px){.d-sm-table{display:table !important}.d-sm-table-cell{display:table-cell !important}.d-sm-block{display:block !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-sm-none{display:none !important}}@media (min-width: 768px){.d-md-table{display:table !important}.d-md-table-cell{display:table-cell !important}.d-md-block{display:block !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-md-none{display:none !important}}@media (min-width: 1012px){.d-lg-table{display:table !important}.d-lg-table-cell{display:table-cell !important}.d-lg-block{display:block !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-lg-none{display:none !important}}@media (min-width: 1280px){.d-xl-table{display:table !important}.d-xl-table-cell{display:table-cell !important}.d-xl-block{display:block !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-xl-none{display:none !important}}@media (max-width: 544px){.hide-sm{display:none !important}}@media (min-width: 544px) and (max-width: 768px){.hide-md{display:none !important}}@media (min-width: 768px) and (max-width: 1012px){.hide-lg{display:none !important}}@media (min-width: 1012px){.hide-xl{display:none !important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);word-wrap:normal;border:0}fieldset{padding:0;margin:0;border:0}label{font-weight:600}.form-control,.form-select{min-height:34px;padding:6px 8px;font-size:14px;line-height:20px;color:#24292e;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #d1d5da;border-radius:3px;outline:none;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075)}.form-control.focus,.form-control:focus,.form-select.focus,.form-select:focus{border-color:#2188ff;outline:none;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075),0 0 0 0.2em rgba(3,102,214,0.3)}.input-contrast{background-color:#fafbfc}.input-contrast:focus{background-color:#fff}::-webkit-input-placeholder{color:#6a737d}::-moz-placeholder{color:#6a737d}:-ms-input-placeholder{color:#6a737d}::placeholder{color:#6a737d}.input-sm{min-height:28px;padding-top:3px;padding-bottom:3px;font-size:12px;line-height:20px}.input-lg{padding:4px 10px;font-size:16px}.input-block{display:block;width:100%}.input-monospace{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace}.input-hide-webkit-autofill::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none !important;pointer-events:none;visibility:hidden}.form-checkbox{padding-left:20px;margin:15px 0;vertical-align:middle}.form-checkbox label em.highlight{position:relative;left:-4px;padding:2px 4px;font-style:normal;background:#fffbdd;border-radius:3px}.form-checkbox input[type=checkbox],.form-checkbox input[type=radio]{float:left;margin:5px 0 0 -20px;vertical-align:middle}.form-checkbox .note{display:block;margin:0;font-size:12px;font-weight:normal;color:#586069}.form-checkbox-details{display:none}.form-checkbox-details-trigger:checked ~ * .form-checkbox-details,.form-checkbox-details-trigger:checked ~ .form-checkbox-details{display:block}.hfields{margin:15px 0}.hfields::before{display:table;content:""}.hfields::after{display:table;clear:both;content:""}.hfields .form-group{float:left;margin:0 30px 0 0}.hfields .form-group dt label{display:inline-block;margin:5px 0 0;color:#586069}.hfields .form-group dt img{position:relative;top:-2px}.hfields .btn{float:left;margin:28px 25px 0 -20px}.hfields .form-select{margin-top:5px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none;appearance:none}.form-actions::before{display:table;content:""}.form-actions::after{display:table;clear:both;content:""}.form-actions .btn{float:right}.form-actions .btn+.btn{margin-right:5px}.form-warning{padding:8px 10px;margin:10px 0;font-size:14px;color:#735c0f;background:#fffbdd;border:1px solid #d9d0a5;border-radius:3px}.form-warning p{margin:0;line-height:1.5}.form-warning a{font-weight:600}.form-select{display:inline-block;max-width:100%;height:34px;padding-right:24px;padding-right:8px \9;background:#fff url("") no-repeat right 8px center;background-image:none \9;background-size:8px 10px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-select::-ms-expand{opacity:0}.form-select[multiple]{height:auto}.select-sm{height:28px;min-height:28px;padding-top:3px;padding-bottom:3px;font-size:12px}.select-sm[multiple]{height:auto;min-height:0}.form-group{margin:15px 0}.form-group .form-control{width:440px;max-width:100%;margin-right:5px;background-color:#fafbfc}.form-group .form-control:focus{background-color:#fff}.form-group .form-control.shorter{width:130px}.form-group .form-control.short{width:250px}.form-group .form-control.long{width:100%}.form-group textarea.form-control{width:100%;height:200px;min-height:200px}.form-group textarea.form-control.short{height:50px;min-height:50px}.form-group dt{margin:0 0 6px}.form-group label{position:relative}.form-group.flattened dt{float:left;margin:0;line-height:32px}.form-group.flattened dd{line-height:32px}.form-group dd h4{margin:4px 0 0}.form-group dd h4.is-error{color:#cb2431}.form-group dd h4.is-success{color:#28a745}.form-group dd h4+.note{margin-top:0}.form-group.required dt label::after{padding-left:5px;color:#cb2431;content:"*"}.form-group .success,.form-group .error,.form-group .indicator{display:none;font-size:12px;font-weight:600}.form-group.loading{opacity:0.5}.form-group.loading .indicator{display:inline}.form-group.loading .spinner{display:inline-block;vertical-align:middle}.form-group.successful .success{display:inline;color:#28a745}.form-group.warn .warning,.form-group.warn .error,.form-group.errored .warning,.form-group.errored .error{position:absolute;z-index:10;display:block;max-width:450px;padding:5px 8px;margin:4px 0 0;font-size:13px;font-weight:normal;border-style:solid;border-width:1px;border-radius:3px}.form-group.warn .warning::after,.form-group.warn .warning::before,.form-group.warn .error::after,.form-group.warn .error::before,.form-group.errored .warning::after,.form-group.errored .warning::before,.form-group.errored .error::after,.form-group.errored .error::before{position:absolute;bottom:100%;left:10px;z-index:15;width:0;height:0;pointer-events:none;content:" ";border:solid transparent}.form-group.warn .warning::after,.form-group.warn .error::after,.form-group.errored .warning::after,.form-group.errored .error::after{border-width:5px}.form-group.warn .warning::before,.form-group.warn .error::before,.form-group.errored .warning::before,.form-group.errored .error::before{margin-left:-1px;border-width:6px}.form-group.warn .warning{color:#735c0f;background-color:#fffbdd;border-color:#d9d0a5}.form-group.warn .warning::after{border-bottom-color:#fffbdd}.form-group.warn .warning::before{border-bottom-color:#d9d0a5}.form-group.errored label{color:#cb2431}.form-group.errored .error{color:#86181d;background-color:#ffdce0;border-color:#cea0a5}.form-group.errored .error::after{border-bottom-color:#ffdce0}.form-group.errored .error::before{border-bottom-color:#cea0a5}.note{min-height:17px;margin:4px 0 2px;font-size:12px;color:#586069}.note .spinner{margin-right:3px;vertical-align:middle}.css-truncate.css-truncate-target,.css-truncate .css-truncate-target{display:inline-block;max-width:125px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}.css-truncate.expandable.zeroclipboard-is-hover .css-truncate-target,.css-truncate.expandable.zeroclipboard-is-hover.css-truncate-target,.css-truncate.expandable:hover .css-truncate-target,.css-truncate.expandable:hover.css-truncate-target{max-width:10000px !important}.TableObject{display:table}.TableObject-item{display:table-cell;width:1%;white-space:nowrap;vertical-align:middle}.TableObject-item--primary{width:99%}.labels{position:relative}.label,.Label{display:inline-block;padding:3px 4px;font-size:12px;font-weight:600;line-height:1;color:#fff;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(27,31,35,0.12)}.label:hover,.Label:hover{text-decoration:none}.Label--gray{color:#586069;background-color:#eaecef}.Label--outline{margin-top:-1px;margin-bottom:-1px;font-weight:normal;color:#586069;background-color:transparent;border:1px solid rgba(27,31,35,0.15);box-shadow:none}.Label--outline-green{color:#28a745;border:1px solid #34d058}.Label--gray-darker{background-color:#6a737d}.Label--orange{background-color:#d15704}.state,.State{display:inline-block;padding:4px 8px;font-weight:600;line-height:20px;color:#fff;text-align:center;background-color:#6a737d;border-radius:3px}.State--green{background-color:#2cbe4e}.State--purple{background-color:#6f42c1}.State--red{background-color:#cb2431}.State--small{padding:0.125em 4px;font-size:12px}.State--small .octicon{width:1em}.Counter{display:inline-block;padding:2px 5px;font-size:12px;font-weight:600;line-height:1;color:#586069;background-color:rgba(27,31,35,0.08);border-radius:20px}.Counter--gray-light{color:#24292e;background-color:rgba(27,31,35,0.15)}.Counter--gray{color:#fff;background-color:#6a737d}.avatar{display:inline-block;overflow:hidden;line-height:1;vertical-align:middle;border-radius:3px}.avatar-small{border-radius:2px}.avatar-link{float:left;line-height:1}.avatar-group-item{display:inline-block;margin-bottom:3px}.avatar-parent-child{position:relative}.avatar-child{position:absolute;right:-15%;bottom:-9%;background-color:#fff;border-radius:2px;box-shadow:-2px -2px 0 rgba(255,255,255,0.8)}.markdown-body{font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>*:first-child{margin-top:0 !important}.markdown-body>*:last-child{margin-bottom:0 !important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cb2431}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre{margin-top:0;margin-bottom:16px}.markdown-body hr{height:0.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:0.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{font-size:inherit}.markdown-body h1{padding-bottom:0.3em;font-size:2em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:0.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:0.875em}.markdown-body h6{font-size:0.85em;color:#6a737d}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:0.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #dfe2e5}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#24292e}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:0;padding-top:0.2em;padding-bottom:0.2em;margin:0;font-size:85%;background-color:rgba(27,31,35,0.05);border-radius:3px}.markdown-body code::before,.markdown-body code::after,.markdown-body tt::before,.markdown-body tt::after{letter-spacing:-0.2em;content:"\00a0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code::before,.markdown-body pre code::after,.markdown-body pre tt::before,.markdown-body pre tt::after{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:#f6f8fa;border-top:0}/*!
 * GitHub Light v0.3.0
 * Copyright (c) 2012 - 2016 GitHub, Inc.
 * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE)
 */.pl-c{color:#969896}.pl-c1,.pl-s .pl-v{color:#0086b3}.pl-e,.pl-en{color:#795da3}.pl-smi,.pl-s .pl-s1{color:#333}.pl-ent{color:#63a35c}.pl-k{color:#a71d5d}.pl-s,.pl-pds,.pl-s .pl-pse .pl-s1,.pl-sr,.pl-sr .pl-cce,.pl-sr .pl-sre,.pl-sr .pl-sra{color:#183691}.pl-v,.pl-smw{color:#ed6a43}.pl-bu{color:#b52a1d}.pl-ii{color:#f8f8f8;background-color:#b52a1d}.pl-c2{color:#f8f8f8;background-color:#b52a1d}.pl-c2::before{content:"^M"}.pl-sr .pl-cce{font-weight:bold;color:#63a35c}.pl-ml{color:#693a17}.pl-mh,.pl-mh .pl-en,.pl-ms{font-weight:bold;color:#1d3e81}.pl-mq{color:#008080}.pl-mi{font-style:italic;color:#333}.pl-mb{font-weight:bold;color:#333}.pl-md{color:#bd2c00;background-color:#ffecec}.pl-mi1{color:#55a532;background-color:#eaffea}.pl-mc{color:#ef9700;background-color:#ffe3b4}.pl-mi2{color:#d8d8d8;background-color:#808080}.pl-mdr{font-weight:bold;color:#795da3}.pl-mo{color:#1d3e81}.pl-ba{color:#595e62}.pl-sg{color:#c0c0c0}.pl-corl{text-decoration:underline;color:#183691}kbd{display:inline-block;padding:3px 5px;font:11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.badmono{font-family:sans-serif;font-weight:600}.diffstat{font-size:12px;font-weight:600;color:#586069;white-space:nowrap;cursor:default}.block-diff-deleted,.block-diff-added,.block-diff-neutral{display:inline-block;width:8px;height:8px;margin-left:1px}.block-diff-deleted,.text-red .block-diff-neutral{background-color:#cb2431}.block-diff-added,.block-diff-neutral{background-color:#2cbe4e}.block-diff-neutral{background-color:#d1d5da}.tab-size[data-tab-size="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}.tab-size[data-tab-size="2"]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}.tab-size[data-tab-size="3"]{-moz-tab-size:3;-o-tab-size:3;tab-size:3}.tab-size[data-tab-size="4"]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.tab-size[data-tab-size="5"]{-moz-tab-size:5;-o-tab-size:5;tab-size:5}.tab-size[data-tab-size="6"]{-moz-tab-size:6;-o-tab-size:6;tab-size:6}.tab-size[data-tab-size="7"]{-moz-tab-size:7;-o-tab-size:7;tab-size:7}.tab-size[data-tab-size="8"]{-moz-tab-size:8;-o-tab-size:8;tab-size:8}.tab-size[data-tab-size="9"]{-moz-tab-size:9;-o-tab-size:9;tab-size:9}.tab-size[data-tab-size="10"]{-moz-tab-size:10;-o-tab-size:10;tab-size:10}.tab-size[data-tab-size="11"]{-moz-tab-size:11;-o-tab-size:11;tab-size:11}.tab-size[data-tab-size="12"]{-moz-tab-size:12;-o-tab-size:12;tab-size:12}.task-list-item{list-style-type:none}.task-list-item label{font-weight:normal}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item .handle{display:none}.task-list-item-checkbox{margin:0 0.2em 0.25em -1.6em;vertical-align:middle}.reorderable-task-lists .markdown-body .contains-task-list{padding:0}.reorderable-task-lists .markdown-body li:not(.task-list-item){margin-left:26px}.reorderable-task-lists .markdown-body ol:not(.contains-task-list) li,.reorderable-task-lists .markdown-body ul:not(.contains-task-list) li{margin-left:0}.reorderable-task-lists .markdown-body li p{margin-top:0}.reorderable-task-lists .markdown-body .task-list-item{padding-right:15px;padding-left:42px;margin-right:-15px;margin-left:-15px;border:1px solid transparent}.reorderable-task-lists .markdown-body .task-list-item+.task-list-item{margin-top:0}.reorderable-task-lists .markdown-body .task-list-item .contains-task-list{padding-top:4px}.reorderable-task-lists .markdown-body .task-list-item .handle{display:block;float:left;width:20px;padding:2px 0 0 2px;margin-left:-43px;opacity:0}.reorderable-task-lists .markdown-body .task-list-item .drag-handle{fill:#333}.reorderable-task-lists .markdown-body .task-list-item.hovered{background:#fafafa;border-top-color:#ededed;border-bottom-color:#ededed}.reorderable-task-lists .markdown-body .task-list-item.hovered>.handle{opacity:1}.reorderable-task-lists .markdown-body .task-list-item.is-dragging{opacity:0}.reorderable-task-lists .markdown-body .task-list-item.is-ghost{border-right-color:#ededed;border-left-color:#ededed}.review-comment-contents .markdown-body .task-list-item{padding-left:42px;margin-right:-12px;margin-left:-12px;border-top-left-radius:3px;border-bottom-left-radius:3px}.review-comment-contents .markdown-body .task-list-item.hovered{border-left-color:#ededed}#user-content-toc{overflow:visible}#user-content-toc tr{border-top:0}#user-content-toc td{padding:0 20px;background-color:#f7f7f7;border:0;border-radius:3px}#user-content-toc ul{padding-left:0;font-weight:600;list-style:none}#user-content-toc ul li{padding-left:0.2em}#user-content-toc ul ul{font-weight:normal}#user-content-toc ul ul li::before{float:left;margin-top:-0.2em;margin-right:0.2em;font-size:1.2em;line-height:1;color:#aaa;content:"\231e"}#user-content-toc ul ul ul{padding-left:0.9em}#user-content-toctitle h2{margin-top:1em;margin-bottom:0.5em;font-size:1.25em;border-bottom:0}*{box-sizing:border-box}html{font-size:14px;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{width:100%;padding:0;margin:0;font:1rem/1.42 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";color:#333;background-color:#fafbfc}button,input,textarea{margin:0;font-family:inherit;font-size:inherit}button{padding:0;margin:0;background:none;border:0}table{border-spacing:0;border-collapse:collapse}a{color:#0366d6;text-decoration:none}a:active{color:inherit}strong{font-weight:600}pre{word-wrap:break-word;white-space:pre-wrap}code,pre{font-family:Consolas, "Liberation Mono", Courier, monospace}hr{background:#eee;border-color:transparent}input[type="checkbox"][disabled]{opacity:0.25}textarea[disabled]::-webkit-input-placeholder{color:#000}.color-icons .octicon-comment-discussion{color:#333}.color-icons .octicon-issue-closed{color:#cb2431}.color-icons .octicon-issue-opened{color:#28a745}.color-icons .octicon-git-branch{color:#28a745}.color-icons .octicon-git-pull-request{color:#28a745}.color-icons .octicon-git-commit{color:#586069}.color-icons .opened{color:#28a745}.color-icons .closed{color:#cb2431}.color-icons .merged{color:#6f42c1}footer{padding:12px 0;font-size:14px;border-top:1px solid #ddd}footer .octicon{float:left;color:#aaa}footer ul{float:right;padding-left:0;margin-top:0;margin-bottom:0}footer li{float:left;line-height:32px;color:#aaa;list-style-type:none}footer li+li{margin-left:15px}footer li a{color:inherit}footer form{display:inline}footer .switch-to-desktop{display:inline;color:inherit}.clearfix::before,.clearfix::after{display:table;line-height:0;content:""}.clearfix::after{clear:both}.protip{margin:20px 0;font-size:13px;color:#666;text-align:center}.labels{position:relative;display:block}.label{font-size:10px}.switcher{position:relative;padding:15px 15px 15px 35px}.switcher.open .switcher-icon-open{display:none}.switcher.open .switcher-icon-close,.switcher.open .switcher-options{display:block}.switcher-toggle{display:block;font-weight:600;color:inherit}.switcher-toggle-meta{display:block;font-size:85%;font-weight:normal;color:#586069}.switcher-options{position:relative;display:none;padding-top:6px}.switcher-option{display:block;padding:6px 0;font-weight:600}.switcher-option .octicon-check{position:absolute;left:-19px}.switcher-option .css-truncate-target{max-width:80%}.switcher-icon{float:left;margin-top:1px;margin-left:-20px;color:#586069}.switcher-icon-open,.switcher-icon-close{position:relative;top:1px;float:right;width:auto;margin-right:0;margin-left:0;color:#586069}.switcher-icon-close{display:none}.octicon.switcher-icon-close{display:none}.octicon.switcher-icon-open{display:block}.bubble{padding:0;margin:0 15px 15px;overflow:hidden;word-break:break-word;word-wrap:break-word;white-space:normal;background:#fff;border:1px solid #ddd;border-radius:3px}.nav-bar+.bubble,.tabs+.bubble{margin-top:15px}.bubble.padded{padding:10px}.bubble.no-padding .bubble-content{padding:0}.bubble.no-margin{margin:0}.bubble.bubble-warn{color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}.bubble-title{display:block;padding:10px 15px;margin:0;font-size:14px;color:#444;border-bottom:1px solid #ddd}.bubble-title .octicon{width:16px;margin-right:2px;margin-left:-3px;color:#586069;text-align:center}.bubble-title time{float:right;font-size:12px;font-weight:normal;line-height:20px;color:#586069}.bubble-content{padding:15px}.bubble-content .markdown-body{padding:0}.bubble-actions{display:table;width:100%;text-align:center;table-layout:fixed}.bubble-content+.bubble-actions,.repo-list+.bubble-actions{border-top:1px solid #ddd}.bubble-action-form{display:table-cell}.bubble-action{display:table-cell;padding:10px 15px;font-weight:500;line-height:1.5;color:#0366d6}.bubble-action+.bubble-action,.bubble-action+.bubble-action-form,.bubble-action-form+.bubble-action,.bubble-action-form+.bubble-action-form{border-left:1px solid #ddd}.bubble-disabled{background:#f5f5f5;border-color:#ccc;box-shadow:inset 0 0 10px rgba(0,0,0,0.1)}.bubble-disabled .bubble-title{color:#586069}.bubble-disabled .bubble-content{font-size:15px;color:#586069;text-align:center}.bubble-disabled .bubble-content.full-bleed{padding:15px}.bubble-disabled .bubble-action{color:#586069}ol ol,ul ol{list-style-type:lower-roman}ul ul ol,ul ol ol,ol ul ol,ol ol ol{list-style-type:lower-alpha}.list{padding:0;margin:0;list-style:none;background-color:#fff}.list:first-child .list-heading:first-child{border-top:0}.list .list-item-template{display:none}.list.list-rendered:empty{display:none}.list.list-rendered .list-item-template{display:block}.list-item{position:relative;display:block;width:100%;padding:14px 15px 14px 35px;line-height:inherit;text-align:left}.list-item+.list-item,.list-item+.list-heading,.list-heading+.list-item{border-top:1px solid #eee}.list-item.with-avatar{padding-left:45px}.list-item.no-padding{padding-left:15px}.list-item>.octicon{position:absolute;top:14px;left:12px;width:16px;text-align:center;vertical-align:bottom}.list-item>.list-item-chevron{top:50%;right:15px;left:auto;margin-top:-10px;font-size:20px;color:#586069}.list-item .avatar{position:absolute;top:14px;left:15px;border-radius:2px}.list-item .meta{float:right;margin-bottom:5px;margin-left:5px;font-size:11px;color:#6a737d}.list-item .meta ~ .list-item-title{margin-right:55px}.list-item .meta .octicon-star{vertical-align:top}.list-item .nwo-link{display:block;margin-bottom:2px;font-size:12px;font-weight:600;color:#586069}.list-item .ref{color:#586069}.list-item .byline{display:block;margin:0;font-size:12px;color:#586069}.list-item .byline strong{font-weight:normal;color:#444}.list-item .labels{margin-top:2px}.list-item.read{background-color:#fafbfc}.list-item.read .list-item-title{color:#586069}.list-item.read>.octicon{color:#586069}.list-item.read .list-action-archive{display:none}.list-item .filename{max-width:100%}.list-item mark{font-weight:600;color:inherit;background-color:inherit}.list-item-title{display:block;margin-bottom:3px;font-weight:600;line-height:1.2;color:#0366d6;word-wrap:break-word}.list-heading{position:relative;padding:7px 15px;clear:both;font-size:12px;font-weight:600;color:#586069;background-color:#f5f5f5;border-top:1px solid #eee}.list-heading::before{display:table;content:""}.list-heading::after{display:table;clear:both;content:""}.list-heading a,.list-heading .btn-link{color:inherit}.list-heading .btn-link>.octicon{opacity:0.65}.list-heading .path-item{float:left}.list-action-form{float:right;margin-top:-10px;margin-right:-15px}.list-action-form>.btn-link{padding:10px 15px;color:#ccc}.list-action-form ~ .list-item-title{margin-right:30px}.list-empty .list-item{padding:45px;font-weight:600;color:#586069;text-align:center}.list-options .list-item .list-item-title{color:#586069}.list-options .list-item>.octicon{color:#fff}.list-options .selected .list-item-title{color:#333}.list-options .selected>.octicon{color:#444}.repo-list-item .repo-name{max-width:80%;margin-right:32px}.repo-list .private{background-color:#fffdef}.repo-list .author-avatar{border-radius:2px}.repo-list .octicon{color:#586069}.repo-list .octicon-lock{color:rgba(27,31,35,0.7)}.repo-list .no-repo{padding:15px;color:#586069;text-align:center}.files-list{word-wrap:break-word}.files-list+.files-list{border-top:1px solid #ddd}.files-list .meta{float:none;margin:5px 0 0}.files-list .warning{font-weight:600;background-color:#fffccc}.files-list .simplified-path{color:#888}.files-list .octicon{top:16px}.files-list .octicon-file-directory{color:#80a6cd}.user-list .follow-list-info{font-size:12px;color:#666}.bubble.auth-form-container{margin-top:30px;margin-bottom:30px}.bubble.auth-form-container label{display:block;margin:0 0 5px}.bubble.auth-form-container .bubble-title{color:#fff;background-color:#586873}.bubble.auth-form-container p{margin:0}.bubble.auth-form-container .form-control{display:block;width:100%;margin:0 0 15px}.auth-form-message{padding:10px}.login-heading{margin-bottom:5px;font-size:13px}.login-heading+p{margin-top:0}.login-note{position:relative;padding:0 15px;font-size:13px}.login-note p{padding-left:22.5px;color:#586069}.login-note.no-icon p{padding-left:0}.login-note .octicon{position:absolute;top:0;left:15px;color:#586069}.login-note .btn{margin-bottom:15px}.u2f-auth-form-body{display:block;padding:10px 20px 20px}.u2f-auth-form-body.unavailable{display:none}section.blog{padding:0 15px}section.blog .pagination{margin-top:20px}section.blog .pagination .next_page{float:right}.post-title{padding:15px 15px 0;margin:0 -15px 5px;margin-bottom:20px;font-size:24px;font-style:normal;font-weight:normal;color:#495961;background-color:rgba(0,0,0,0.01)}.byline{margin-bottom:15px;font-size:13px;color:#586069}.byline span,.byline span img,.byline a{vertical-align:top;border-radius:3px}.byline a{color:#586069}.byline .author{margin-left:12px}.post-content h3{border-bottom:1px solid #eee}.post-content ol{list-style-type:decimal}.post-content ul{list-style-type:disc}.post-content img{width:100%;box-sizing:border-box;padding:3px;border:1px solid #d8d8d8}.post-content img.emoji{width:inherit;border:0}.post-content .anchor{display:none}.post-content .user-mention{color:#333}.post-content code{white-space:normal}.post-content iframe{max-width:100%;height:inherit}.posts h3,.recent-posts h3{padding:0;margin:15px 0 5px;font-size:14px;font-style:normal;font-weight:normal;color:#586069}.posts ul,.recent-posts ul{padding-left:0}.posts li,.recent-posts li{margin-bottom:10px;line-height:1.2;list-style-type:none}.posts li a,.recent-posts li a{font-size:20px;font-style:normal;font-weight:normal}.recent-posts{padding:15px;margin:15px 0 0;background-color:#fff;border-top:1px solid #eee}.recent-posts h3{margin-top:0}.recent-posts p{margin-bottom:0}.recent-posts li a{font-size:16px}.btn{display:inline-block;padding:9px 15px;margin:0;font-size:13px;font-weight:600;line-height:1.5;color:#333;text-align:center;text-shadow:0 1px 0 rgba(255,255,255,0.9);white-space:nowrap;vertical-align:middle;background-image:-webkit-linear-gradient(#fafafa, #eaeaea);background-image:linear-gradient(#fafafa, #eaeaea);border:1px solid #ddd;border-bottom-color:#cecece;border-radius:3px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:active{background-color:#6a737d;background-image:none;border-color:#444;box-shadow:0 1px 3px rgba(0,0,0,0.075),inset 0 0 5px rgba(0,0,0,0.2)}.btn:disabled,.btn.disabled{pointer-events:none;opacity:0.3}.btn .count{position:relative;margin:0 0 0 3px;font-size:11px;font-weight:100;color:rgba(0,0,0,0.4);text-shadow:none;border-radius:10px}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-image:-webkit-linear-gradient(#8add6d, #60b044);background-image:linear-gradient(#8add6d, #60b044);border-color:#5ca941}.btn-danger{color:#900}.btn-block{display:block;width:100%;text-align:center}.btn-block+.btn-block{margin-top:10px}.section-title button{float:right;padding:0;margin:0;font-size:12px;color:#586069;background:transparent;border:0;box-shadow:none}.section-title button .octicon{color:#586069}.btn-link{display:inline;padding:0;font-size:inherit;color:#0366d6;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.mobile.commit{display:block;float:none;width:100%;padding:15px;color:#213f4d;background-color:#e6f1f6;border-bottom:1px solid #d1e2eb}.mobile.commit .commit-desc pre{padding:0;margin:0;font-size:12px}.commit-title{margin:0 0 5px;font-size:13px;font-weight:600}.commit-list .message{color:#333}.commit-authorship{padding:7.5px 0;font-size:12px;line-height:24px;color:#586069;background-color:#fff}.commit-authorship .avatar{float:left;margin-right:8px;margin-left:15px;border-radius:3px}.commit-authorship a{font-weight:600}.diff-view .file{position:relative;margin-bottom:15px;border-top:1px solid #d1d5da;border-bottom:1px solid #d1d5da}.diff-view .file:last-child:not(:only-child){border-bottom:0}.diff-view .file .meta{padding:5px 10px 3px;font-size:12px;color:#555;text-align:left;text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(#fff, #f5f5f5);background-image:linear-gradient(#fff, #f5f5f5);border-bottom:1px solid #d8d8d8}.diff-view .file .meta .info{position:relative;padding:6px 0;padding-left:30px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;line-height:1.2}.diff-view .file .meta .file-label{padding-left:0;margin-left:0;word-break:break-all;border-left:0 none;box-shadow:inset 0 0 0 transparent}.diff-view .file .meta span.icon{display:inline-block;padding:3px;margin:5px 5px 0 0;line-height:0;background:#f7f7f7;border:1px solid #ccc;border-right-color:#e5e5e5;border-bottom-color:#e5e5e5;border-radius:3px}.diff-view .file .meta .octicon-file-text{color:#aaa}.diff-view .file .file-label a{color:inherit}.diff-view .file .highlight{overflow:auto;overflow-x:auto;overflow-y:hidden}.diff-view .file .empty{padding:5px 10px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;line-height:24px;color:#555}.diff-view .file .file-code{border-spacing:0;border-collapse:separate;background-color:#fff}.diff-view .file .file-diff-line{position:relative;cursor:pointer}.diff-view .file .blob-num{padding:0 3px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;line-height:18px;color:rgba(0,0,0,0.3);text-align:right;vertical-align:top}.diff-view .file .blob-num::before{content:attr(data-line-number)}.diff-view .file .blob-code{padding-right:10px;padding-left:10px}.diff-view .file .blob-code-inner{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;color:#333;white-space:pre}.diff-view .file .blob-code-inner .x-first{border-top-left-radius:0.2em;border-bottom-left-radius:0.2em}.diff-view .file .blob-code-inner .x-last{border-top-right-radius:0.2em;border-bottom-right-radius:0.2em}.diff-view .file.soft-wrap .blob-code-inner{word-wrap:break-word;white-space:pre-wrap}.diff-view .file .prose .blob-code-inner{white-space:pre-wrap}.diff-view .file .blob-code-hunk{color:#586069;background-color:#f8f8ff}.diff-view .file .blob-num-hunk{background-color:#f3f3ff;border-color:#e4e4ff}.diff-view .file .blob-code-addition{background-color:#eaffea}.diff-view .file .blob-code-addition .x{background-color:#a6f3a6}.diff-view .file .blob-num-addition{background-color:#dbffdb;border-color:#c1e9c1}.diff-view .file .blob-code-deletion{background-color:#ffecec}.diff-view .file .blob-code-deletion .x{background-color:#f8cbcb}.diff-view .file .blob-num-deletion{background-color:#ffdddd;border-color:#f1c0c0}.diff-view .file span.no-nl-marker{position:relative;top:1px;margin-left:4px;color:#cb2431;vertical-align:middle}.diff-view .inline-comments{background-color:#fafbfc}.diff-view table .discussion-block{border-right:1px solid #ddd}.diff-view .inline-comment-form-container{width:100vw;border-right:1px solid #ddd}.add-inline-comment{cursor:pointer}.inline-comment-form{background-color:#fafbfc}.inline-comment-form .inline-note-reply{background-color:transparent;border-top:0}.inline-comment-form-container{padding:15px}.inline-comment-form-container .discussion-reply{padding:0}.comment-holder+.inline-comment-form-container{padding-top:0}.inline-comment-form-container .inline-comment-form,.inline-comment-form-container.open .inline-comment-form-actions{display:none}.inline-comment-form-container .inline-comment-form-actions,.inline-comment-form-container.open .inline-comment-form{display:block}.line-comments{padding:0;border:solid #ddd;border-width:1px 0}.inline-comments .discussion-block{max-width:100vw}.inline-comments .bubble-content{padding-top:10px;padding-bottom:10px}.inline-comments .markdown-body{font-size:85%}.inline-comments:last-child .line-comments{border-bottom:0}.timeline-inline-comments{width:100%;overflow:hidden}.timeline-inline-comments .inline-comment-form-container:last-child{border-bottom:1px solid #ddd}.timeline-review-comment-thread .diff-view .file{margin-bottom:0}.timeline-review-comment-thread .file-code{width:100%}.inline-note-sign-in-container{padding:15px;font-size:85%;text-align:center}.inline-note-sign-in-container .btn{margin-bottom:15px}.inline-comment-form-template-container{display:none}.diffstat{position:absolute;top:4px;left:0}.highlighted-blob{white-space:pre-wrap}.mobile-toc{background-color:#fff}.mobile-toc.open .switcher-options{display:block}.mobile-toc .diffstat{position:static}.mobile-toc .switcher-option{font-size:85%;font-weight:normal}.mobile-toc .switcher-option .octicon{float:left;margin-left:-20px;color:#ccc}.mobile-toc .switcher-option .octicon-diff-removed{color:#cb2431}.mobile-toc .switcher-option .octicon-diff-renamed{color:#677a85}.mobile-toc .switcher-option .octicon-diff-modified{color:#d0b44c}.mobile-toc .switcher-option .octicon-diff-added{color:#28a745}.add-comment-label,.review-cancel-button,.is-review-pending .start-review-label{display:none}.start-review-label,.is-review-pending .review-cancel-button,.is-review-pending .submit-review-button,.is-review-pending .add-comment-label{display:inline-block}.is-review-pending .submit-review-button{width:auto}.discussion-header{padding:15px 15px 0;background:#fff}.discussion-header .state{font-size:12px;line-height:16px;border-radius:2px}.discussion-header .discussion-block-title{padding:10px 0 15px}.discussion-header .pull-request-description-toggle .pull-request-description{display:block}.discussion-header .pull-request-description-toggle .pull-request-description-full{display:none}.discussion-header .pull-request-description-toggle.open .pull-request-description{display:none}.discussion-header .pull-request-description-toggle.open .pull-request-description-full{display:block}.discussion-header .branches{padding:7.5px 0;margin:0;font-size:12px;color:#aaa;cursor:pointer}.discussion-header .branches .branch-name{position:relative;display:inline-block;padding-left:20px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;color:#586069}.discussion-header .branches .branch-name .octicon{position:absolute;top:0;left:0}.discussion-header .branches .octicon-git-branch{width:16px;text-align:left}.discussion-header .branches .octicon-arrow-up{display:block;width:100%;margin-left:20px}.discussion-header .branches .css-truncate-target{max-width:90%}.discussion-title{margin-bottom:0;font-size:16px;word-wrap:break-word}.discussion-labels{padding:15px 15px 0;background-color:#fff}.discussion-labels .octicon{position:relative;top:2px;margin-right:2px;color:#586069}.discussion-starting-comment{position:relative}.discussion-starting-comment+.discussion-reply-container{margin-top:-1px}.discussion-starting-comment .avatar{position:absolute;left:15px;margin-right:10px;border-radius:2px}.discussion-starting-comment time{margin:0 15px;color:#586069}.discussion-starting-comment .username,.discussion-starting-comment .num{color:#666}.discussion-starting-comment .discussion-title .num{font-weight:100;color:#aaa}.discussion-starting-comment .discussion-block-title{padding-left:60px}.discussion-comment{padding:15px;background:#fff;border-bottom:1px solid #ddd}.commit-comments-header{padding:0 15px;font-size:14px}.commit-comments-header-sha{font-weight:normal}.discussion-block-title{position:relative;padding:10px 15px;font-size:12px;line-height:16px;color:#586069;background-color:#fff;border-bottom:1px solid #eee}.discussion-block-title::before{display:table;content:""}.discussion-block-title::after{display:table;clear:both;content:""}.discussion-block-title .avatar{float:left;margin-right:10px;border-radius:3px}.discussion-block-title .timestamp{color:#586069}.discussion-block-title .username{font-weight:600;color:#444}.discussion-block-meta{margin-left:42px}.discussion-block-meta .editor{color:#444}.commit{float:left;margin:0 10px 0 0}.bubble.is-pending{border-color:#d9d0a5}.bubble.is-pending .discussion-block-title{background-color:#fffbdd;border-color:#d9d0a5}.bubble .commit-message{padding:0;margin:0;color:#444;white-space:pre-wrap}.discussion-block{padding:15px}.discussion-block>.bubble{margin:0}.discussion-block-header{padding:25px 15px 7.5px;font-size:12px;font-weight:600;color:#586069;background-color:#f5f5f5;border-top:1px solid #ddd}.discussion-event{position:relative;padding:15px}.discussion-event .branch{font-weight:600;color:#444;white-space:nowrap;vertical-align:middle}.discussion-event .branch.css-truncate-target{max-width:165px}.discussion-event .timestamp{color:inherit}.timeline-truncation-container{padding-right:0;padding-left:0}.timeline-truncation-container+.discussion-block{padding-top:15px;border-top:1px solid #eee}.timeline-truncation-container .switch-to-desktop{color:#0366d6}.timeline-truncation-title{margin-top:0;margin-bottom:5px;font-weight:600;color:#586069}.issue-event{position:relative;padding-left:40px;font-size:13px;color:#586069}.issue-event:last-of-type{border-bottom:0}.issue-event .avatar{position:absolute;top:0;left:15px}.issue-event strong{color:#444}.issue-event .meta{margin:0.5em 0 0;font-size:12px;color:#586069}.issue-event .label{font-size:90%}.issue-event-icon{position:absolute;top:16px;left:15px;width:16px;color:#999;text-align:center}.issue-event-icon-open{color:#28a745}.issue-event-icon-closed{color:#cb2431}.issue-event-icon-merged{color:#6f42c1}.issue-event-icon-locked{color:#333}.issue-event-icon-unlocked{color:#28a745}.closed-event{padding-bottom:15px;border-bottom:5px solid #ddd}.dead-pull-request-review-comment{position:relative;display:block;padding-left:20px;margin:0 15px 15px;font-size:12px;color:#586069}.dead-pull-request-review-comment .octicon{position:absolute;top:0;left:0}.dead-pull-request-review-comment .username{font-weight:600;color:#586069}.timeline-review-comment-thread-container.dead .octicon{color:#aaa}.timeline-review-comment-thread-container.dead.open .octicon-unfold,.timeline-review-comment-thread-container.dead.open .show-diff{display:none}.timeline-review-comment-thread-container.dead:not(.open) .octicon-fold,.timeline-review-comment-thread-container.dead:not(.open) .hide-diff,.timeline-review-comment-thread-container.dead:not(.open) .timeline-review-comment-thread{display:none}.cross-reference .bubble-title{font-size:12px;color:#737b7c;background-image:-webkit-linear-gradient(#f8fbfc, #eef1f4);background-image:linear-gradient(#f8fbfc, #eef1f4);border-bottom:1px solid #e0e2e5}.cross-reference .bubble-title a{color:#737b7c}.cross-reference .bubble-title.private{padding-left:30px;background-color:#fffdef;background-image:none}.cross-reference .bubble-title .octicon-lock{float:left;margin-left:-20px;color:rgba(27,31,35,0.7)}.cross-reference .bubble-content a{color:#444}.timeline-commits-container{padding:15px;font-size:12px;line-height:16px;color:#666}.timeline-commits-container .octicon-repo-push{position:absolute;top:1px;left:1px;margin-right:10px;color:#aaa}.timeline-commits-container .author{font-weight:600;color:#666}.timeline-commits-container .timestamp{color:#666}.timeline-commits-container .timeline-commits{width:100%;margin-top:7.5px}.timeline-commits-container .timeline-commits td{padding:4px 0}.timeline-commits-container .commit-message a{color:#666;word-break:break-word}.commit-meta{width:36px;text-align:right}.commit-meta a{color:#aaa}.commit-meta .octicon{position:inline-block}.commit-meta .octicon-x{color:#cb2431}.commit-meta .octicon-check{margin-left:3px;color:#28a745}.commits-header{position:relative;padding-left:25px}.commit-avatar-container{width:25px}.commit-avatar-container .avatar{border-radius:2px}.timeline-review-container .file-header{padding:3px 10px 5px;background-color:#f7f7f7;border-top:1px solid #d1d5da;border-radius:0}.timeline-review-container .file-header:first-child{border-top:0;border-radius:3px 3px 0 0}.timeline-review-container .file-info{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px}.timeline-review-container .bubble{margin-top:15px}.timeline-review-container .inline-comment-form{background-color:#fff}.timeline-review-container .inline-comment-form-container{padding:10px 15px}.timeline-review-container.is-pending{border-color:#d9d0a5}.timeline-review-container.is-pending .label,.timeline-review-container.is-pending .file-header{color:#735c0f;background-color:#fffbdd}.timeline-review-container.is-pending .bubble{border-color:#d9d0a5}.timeline-review-container .file-code{width:auto;min-width:100%;white-space:nowrap;table-layout:fixed}.timeline-review-header{display:table;font-size:12px;color:#666}.timeline-review-icon{display:table-cell;width:24px;vertical-align:top}.timeline-review-icon .octicon{margin-top:-1px;color:#6a737d}.timeline-review-icon .octicon-eye{margin-top:0}.timeline-review-icon .octicon-x{margin-top:0;margin-left:2px}.timeline-review-icon .octicon-check{margin-left:2px}.timeline-review-avatar{display:table-cell;padding-right:5px}.timeline-review-meta{display:table-cell;vertical-align:top}.timeline-review-meta .author{color:#666}.discussion-item-review-comment{border-bottom:1px solid #eaecef}.discussion-item-review-comment:last-child{border-bottom:0}.outdated-comment .timeline-review-comment-thread,.outdated-comment .hide-outdated-button{display:none}.outdated-comment .file-header{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.outdated-comment.open .timeline-review-comment-thread,.outdated-comment.open .hide-outdated-button{display:block}.outdated-comment.open .show-outdated-button{display:none}.outdated-comment.open .file-header{border-bottom-right-radius:0;border-bottom-left-radius:0}.outdated-comment-label{line-height:22px}.user-mention,.team-mention{font-weight:600;color:#24292e}.discussion-create{margin:15px 15px 0}.discussion-create .form-control{margin-bottom:8px}.discussion-create .btn{margin-top:7.5px;margin-bottom:15px}.discussion-block+.discussion-block,.discussion-block+.discussion-event,.discussion-block+.timeline-commits-container,.discussion-event+.discussion-event,.discussion-event+.discussion-block,.discussion-event+.timeline-commits-container,.timeline-commits-container+.discussion-event,.timeline-commits-container+.discussion-block,.timeline-commits-container+.timeline-commits-container{border-top:1px solid #eee}.discussion-reply{padding:15px;text-align:right;background-color:#fff;border-top:1px solid #ddd}.discussion-reply .btn{margin-top:8px}.discussion-reply .btn+.btn{margin-left:8px}.comment-sign-in-container{padding:15px;font-size:13px;text-align:center}.comment-sign-in-container .btn{margin:0 0 15px}.thread-subscription-status{padding:15px;background-color:#fff;border-top:1px solid #ddd}.thread-subscription-status .octicon-radio-tower{float:left;color:#ccc}.thread-subscription-description{position:relative;min-height:30px;padding-left:42px;margin-top:0;font-size:13px;color:#586069}.thread-subscription-description .octicon{position:absolute;left:0}.line-comment-info{position:relative;padding:7.5px 15px;font-size:12px;color:#586069;border-bottom:1px solid #ddd}.line-comment-info::before,.line-comment-info::after{position:absolute;width:0;height:0;content:""}.line-comment-info::before{bottom:-8px;left:15px;z-index:10;border-top:8px solid #ddd;border-right:8px solid transparent;border-left:8px solid transparent}.line-comment-info::after{bottom:-7px;left:16px;z-index:20;border-top:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent}.mobile-featured-carousel{margin:10px 0;overflow:auto;-webkit-overflow-scrolling:touch}.mobile-featured-carousel .mobile-featured-collections{padding:0;margin:0 15px;white-space:nowrap;list-style-type:none}.mobile-featured-carousel .mobile-featured-collection{display:inline-block;width:100%;padding:0;margin:0 5px 0 0}.mobile-featured-carousel .mobile-featured-collection:last-child{margin-right:15px}.mobile-featured-carousel .mobile-featured-collection-head{display:table;width:100%;height:150px;border-radius:3px}.mobile-featured-carousel .mobile-featured-collection-title{display:table-cell;padding:10px;font-size:18px;font-weight:500;color:#fff;text-align:center;white-space:pre-line;vertical-align:middle}.showcase-collection .header{padding:20px 15px;background:#555 url("/images/modules/home/octicons-bg.png") center repeat}.showcase-collection .header .avatar{width:20px;height:20px;vertical-align:middle;border-radius:2px}.showcase-collection .title{margin:0;font-size:18px;font-weight:500;color:#fff}.showcase-collection .description{margin:15px;font-size:15px}.showcase-collection .showcase-items .title-meta-info{margin-left:5px;font-size:12px;font-weight:normal;color:#586069}.showcase-collection .showcase-items .bubble-title{font-weight:600;line-height:30px;color:#4183c4}.showcase-collection .showcase-items .avatar{width:30px;height:30px;margin-right:5px;vertical-align:middle;border-radius:2px}.flash{position:relative;padding:15px;font-size:14px;font-weight:600;color:#264c72;background-color:#dbeaf9;border-bottom:solid 1px #bac6d3}.flash+.flash{margin-top:5px}.flash .container{margin-right:0;margin-left:0}.flash .octicon-x{display:none}.flash .flash-action{float:right;margin-top:-5px}.flash.flash-warn{color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}.flash.flash-error{color:#911;background-color:#fcdede;border-color:#d2b2b2}.flash-messages.container{margin:0 0 15px}.touchable{-webkit-tap-highlight-color:transparent}.nav-bar{position:relative;overflow:visible;color:rgba(255,255,255,0.75);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#1e2327}.nav-bar-inner{height:50px;margin:0 2px;line-height:50px;text-align:center}.nav-bar-inner .header-button{position:absolute;padding:5px 8px;line-height:1;color:inherit;background:transparent;border:0;border-radius:5px}.nav-bar-inner .header-button:active,.nav-bar-inner .header-button:focus{outline:0;box-shadow:none}.nav-bar-inner .header-context-button{top:8px;right:8px}.nav-bar-inner .header-nav-button{top:8px;left:8px}.nav-bar-inner .octicon-lock{top:-1px;margin-right:5px}.nav-bar-inner .brand-logo-invertocat .octicon,.nav-bar-inner .brand-logo-wordmark .octicon{margin-top:-8px;color:#fff;vertical-align:text-top}.nav-bar-inner.has-notifications{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.nav-bar-inner.has-notifications .header-button{position:static;max-width:44px;padding:0 12px}.nav-bar-inner.has-notifications .header-context-button{padding-top:14px}.nav-bar-inner.has-notifications .header-notification-button{position:relative;padding-top:14px}.unread-notifications-indicator{position:absolute;top:7px;right:5px;display:block;width:14px;height:14px;background-color:#2188ff;border:2px solid #1e2327;border-radius:50%}.nav-bar-title-text{position:relative;max-width:75%;padding:0 5px;margin:0 auto;overflow:hidden;font-size:14px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.has-notifications .nav-bar-title-text{position:static;max-width:none;margin:0;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.nav-bar-meta{padding:7.5px 15px;font-size:75%;text-align:center;border-top:1px solid #ddd}.nav-bar-tabs{position:absolute;z-index:9000;display:none;width:100%;height:0;padding:7.5px 0;overflow:hidden;font-size:16px;background-color:#1e2327;background-clip:padding-box}.nav-bar-tabs ul{padding:0;margin:0;list-style:none}.nav-bar-tabs a{position:relative;display:block;padding:8px 15px 8px 45px;color:rgba(255,255,255,0.75)}.nav-bar-tabs a .avatar,.nav-bar-tabs a .octicon{float:left;margin-top:3px;margin-left:-30px}.nav-bar-tabs a .octicon{width:20px;text-align:center}.nav-bar-tabs .section-title{padding:15px 0 0 15px;margin-top:7.5px;margin-bottom:0;font-size:12px;text-transform:uppercase}.nav-bar-tabs .unread-notifications-indicator{position:static;display:inline-block;vertical-align:-2px}.nav-is-open .nav-bar-tabs{display:block;height:auto}.markdown-body{font-size:15px}.markdown-body blockquote{margin-right:0;margin-left:0}.markdown-body code{white-space:normal}.markdown-body.email-format{line-height:1.5em !important}.markdown-body.email-format div{white-space:pre-wrap}.markdown-body .email-hidden-reply{display:none;white-space:pre-wrap}.markdown-body .email-hidden-reply.expanded{display:block}.markdown-body .email-quoted-reply,.markdown-body .email-signature-reply{padding:0 15px;margin-bottom:15px;color:#586069;border-left:4px solid #ddd}.breadcrumb{padding:15px;font-size:12px;color:#586069;border-bottom:1px solid #ddd}.breadcrumb .separator{margin:0 0.25em}.breadcrumb .octicon{margin-top:-1px;margin-right:5px}.breadcrumb a{font-weight:600}.breadcrumb strong{color:#444}.tabs{display:table;width:100%;table-layout:fixed}.tabs>a{display:table-cell;padding:10px 0;font-size:14px;font-weight:600;text-align:center;border-bottom:1px solid #ddd}.tabs>a.selected{color:#444;background-color:#fff;border-right:1px solid #ddd;border-bottom-color:#fff;border-left:1px solid #ddd}.tabs>a:first-child{border-left:0}.tabs>a:last-child{border-right:0}.pagination{position:relative;z-index:2;display:table;padding:0;margin-top:0;margin-bottom:-1px;background-color:#fafbfc}.pagination a,.pagination span,.pagination em{display:table-cell;width:1%;padding:10px 15px;color:#555;text-align:center;border:1px solid #ddd;border-left-color:#fff}.pagination a:first-child,.pagination span:first-child,.pagination em:first-child{border-left:0}.pagination a:last-child,.pagination span:last-child,.pagination em:last-child{border-right:0}.pagination span>a{padding:0}.pagination .current{font-style:normal;font-weight:600;color:#fff;background-color:#6a737d;background-image:-webkit-linear-gradient(#6a737d, #999);background-image:linear-gradient(#6a737d, #999);border-color:#6a737d}.pagination .gap,.pagination .disabled{color:#ccc}.oauth-header{padding:15px 15px 0;margin:0 0 15px;background:#fff;border-bottom:1px solid #ddd}.oauth-header::before{display:table;content:""}.oauth-header::after{display:table;clear:both;content:""}.oauth-header h1{margin-bottom:0;font-size:18px}.oauth-header .lead{margin-top:0;font-size:14px;color:#586069}.oauth-connection-illustration{position:relative;float:right;width:auto;margin-top:12px;margin-left:10px}.oauth-connection-illustration .oauth-image{float:left;padding:2px;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);border-radius:3px}.oauth-connection-illustration .oauth-image img{display:block;width:48px;height:48px;border-radius:3px}.oauth-connection-illustration .oauth-image.oauth-image-user{margin-top:20px;margin-left:-20px}.oauth-main .oauth-permissions-icon{float:left;margin-top:4px;margin-left:0;color:#586069;text-align:center}.oauth-main .permission-title{display:block;margin-bottom:2px;color:#000}.oauth-main .permission-summary,.oauth-main .permission-note{margin-left:34px}.oauth-main .permission-summary{line-height:1}.oauth-main .permission-summary .access-details{position:relative;color:#586069}.oauth-main .permission-note{margin-bottom:0;font-size:12px;color:#586069}.oauth-main .permission-note ul{padding-left:18px;margin:1em 0;list-style-type:disc}.oauth-main em.highlight{position:relative;padding:2px 3px;margin-right:-2px;margin-left:-3px;font-style:normal;color:#4c4a42;background:#fff9ea;border-radius:3px}.oauth-requests-summary{display:table;width:100%;table-layout:fixed}.oauth-requests-summary .octicon,.oauth-requests-summary .access-details{margin:0}.oauth-requests-summary .access-details{padding:0 10px 0 40px}.oauth-requests-summary .access-details p:first-child{margin-top:0}.oauth-requests-summary .access-details p:last-child{margin-bottom:0}.oauth-requests-summary .access-details .secondary-details{font-size:12px;color:#586069}.oauth-requests-summary .octicon-organization.approved{color:#28a745}.added-permission{color:#28a745}.oauth-permission-title{margin:15px 15px 5px}.oauth-secondary{font-size:12px}.oauth-secondary .no-description{margin-top:0;color:#586069}.oauth-secondary .learn-more,.oauth-secondary .existing-access{padding-top:15px;margin-bottom:5px;border-top:1px solid #eee}.oauth-secondary .features-list{padding:0;margin:0;list-style:none}.oauth-secondary .features-list li{margin-top:10px}.oauth-secondary .features-list li:first-child{margin-top:0}.oauth-secondary .features-list .list-divider{margin:15px -15px;border-top:1px solid #eee}.oauth-secondary .features-list .octicon{margin-right:5px;color:#60b044}.oauth-permissions-details .content{display:none}.oauth-permissions-details.open .content{display:block}.oauth-permissions-details.default .default-access{display:inline}.oauth-permissions-details.full .full-access{display:inline}.oauth-user-permissions .full-access,.oauth-user-permissions .limited-access,.oauth-user-permissions .limited-access-emails-followers,.oauth-user-permissions .limited-access-emails-profile,.oauth-user-permissions .limited-access-followers-profile,.oauth-user-permissions .limited-access-profile,.oauth-user-permissions .limited-access-followers,.oauth-user-permissions .limited-access-emails,.oauth-user-permissions .no-access{display:none}.oauth-user-permissions.limited.limited-email .limited-access-emails{display:inline}.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-profile{display:none}.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-emails-profile{display:inline}.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-profile,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-followers,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails-profile,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails-followers,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-followers-profile{display:none}.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access{display:inline}.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-followers{display:none}.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-emails-followers{display:inline}.oauth-user-permissions.limited.limited-follow .limited-access-followers{display:inline}.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-followers,.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-profile{display:none}.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-followers-profile{display:inline}.oauth-user-permissions.limited.limited-profile .limited-access-profile{display:inline}.oauth-repo-permissions .default-access,.oauth-repo-permissions .public-access,.oauth-repo-permissions .full-access{display:none}.oauth-repo-permissions.public .public-access{display:inline}.oauth-delete-repo-permissions .octicon-alert{color:#cb2431}.oauth-repo-status-permissions .no-access,.oauth-repo-status-permissions .full-access{display:none}.oauth-notifications-permissions .no-access,.oauth-notifications-permissions .read-access,.oauth-notifications-permissions .via-public-access,.oauth-notifications-permissions .via-full-access{display:none}.oauth-notifications-permissions.read .read-access{display:inline}.oauth-notifications-permissions.via-public .via-public-access{display:inline}.oauth-notifications-permissions.via-public .octicon{display:none}.oauth-notifications-permissions.via-full .via-full-access{display:inline}.oauth-gist-permissions .no-access,.oauth-gist-permissions .full-access{display:none}.oauth-granular-permissions .no-access,.oauth-granular-permissions .read-access,.oauth-granular-permissions .write-access,.oauth-granular-permissions .full-access{display:none}.oauth-granular-permissions.none .no-access{display:inline}.oauth-granular-permissions.read .read-access{display:inline}.oauth-granular-permissions.write .write-access{display:inline}.oauth-granular-permissions.full .full-access{display:inline}.oauth-connect{padding-bottom:15px;margin:0 15px}.issues-reset-query-wrapper{padding:15px;background-color:#fff;border-bottom:solid 1px #eee}.subset-files-tab{background-color:#e6f1f6}.branch-action{padding:15px;font-size:12px;color:#586069;background-color:#fff;border-top:1px solid #eee}.discussion-block-header+.branch-action{border-top-color:#ddd}.branch-action-with-icon{padding-left:35px}.branch-action-heading{margin-top:0;margin-bottom:0;font-size:14px;color:#24292e}.branch-action-icon{float:left;width:16px;margin-left:-23px;text-align:center}.branch-action-expandable{border-top:1px solid #eee}.discussion-block-header+.branch-action-expandable{border-top-color:#ddd}.branch-action-expandable .list-item{padding-right:40px}.branch-action-expandable .list-items-overflow{max-height:170px;-webkit-overflow-scrolling:touch;overflow-y:auto;font-size:13px;background-color:#f5f5f5;border-top:1px solid #eee}.branch-action-expandable .list-items-overflow .list-item{padding-top:7px;padding-bottom:7px}.branch-action-expandable .list-items-overflow .list-item-state-icon{top:8px}.branch-action-expandable .octicon-fold,.branch-action-expandable .list-items-overflow{display:none}.branch-action-expandable.open .octicon-fold,.branch-action-expandable.open .list-items-overflow{display:block}.branch-action-expandable.open .octicon-unfold{display:none}.branch-action-expandable .list-item:first-child .list-item-chevron{top:14px;margin-top:2px;font-size:18px}.branch-actions-details{margin-right:-25px}.merge-branch{position:relative}.merge-branch .is-loading .octicon{display:none}.merge-branch .is-loading .mergeable-state-loading{display:inline-block;width:16px;height:16px;background-image:url("/images/spinners/octocat-spinner-16px.gif")}.merge-branch .mergeable-state-message{margin-top:0;margin-bottom:0;font-size:12px;color:#586069}.merge-branch .mergeable-state-message.required{display:block;color:#586069}.merge-branch .merge-branch-form,.merge-branch .mergeable-state-message{display:none}.merge-branch.open{border-top:3px solid #ddd}.merge-branch.open .octicon-git-pull-request,.merge-branch.open .merge-message{display:none}.merge-branch.open.mergeable-state-clean .merge-branch-form{display:block}.merge-branch.open.mergeable-state-unstable .mergeable-state-message.unstable{display:block}.merge-branch.open.mergeable-state-dirty .mergeable-state-message.dirty{display:block}.merge-branch.open.mergeable-state-blocked .mergeable-state-message.blocked{display:block}.merge-branch.mergeable-state-error .mergeable-state-message.error{display:block}.merge-commit-message{margin:7.5px 0}.merge-commit-title{font-weight:600}.merge-form-author{margin-bottom:15px;font-size:12px;line-height:20px;color:#586069}.merge-form-author .avatar{margin-right:5px}.merge-options{margin-right:0;margin-left:0;color:#24292e}.merge-options .list-item{padding-top:10px;padding-bottom:10px}.merge-options .byline{font-weight:normal}.merge-option-radio{position:absolute;top:12px;left:12px;margin-right:3px}.merge-branch-form .btn-merge{display:block}.merge-branch-form .btn-squash,.merge-branch-form .btn-rebase{display:none}.merge-branch-form.is-squashing .btn-merge,.merge-branch-form.is-squashing .btn-rebase{display:none}.merge-branch-form.is-squashing .btn-squash{display:block}.merge-branch-form.is-rebasing .merge-commit-title,.merge-branch-form.is-rebasing .merge-commit-message{display:none}.merge-branch-form.is-rebasing .btn-merge,.merge-branch-form.is-rebasing .btn-squash{display:none}.merge-branch-form.is-rebasing .btn-rebase{display:block}.repository-meta{margin:15px;font-size:13px;color:#666}.repository-meta-url{word-wrap:break-word}.branch-selector{position:relative;padding-left:19px;font-weight:600}.branch-selector .octicon.octicon-git-branch{position:absolute;top:1px;left:0}.branch-selector .octicon.octicon-chevron-up,.branch-selector .octicon.octicon-chevron-down{position:relative;top:1px;float:right;width:auto;margin-right:0;margin-left:0}.branch-selector .octicon.octicon-chevron-up{display:none}.branch-selector label{display:block;font-size:inherit}.branch-selector-toggle{display:none}.branch-selector-toggle:checked ~ label .octicon-chevron-up{display:block}.branch-selector-toggle:checked ~ label .octicon-chevron-down{display:none}.branch-selector-toggle:checked ~ .branch-selector-options{display:block}.branch-selector-options{position:relative;display:none;padding-top:6px;font-size:13px;font-weight:normal}.branch-selector-option{display:block;padding:6px 0;font-size:14px;font-weight:600}.branch-selector-option .octicon-check{position:absolute;left:-19px}.branch-selector-all-branches{display:block;padding:6px 0}.latest-commit .commit-author{position:relative;padding-top:8px;padding-bottom:8px;font-size:12px;line-height:20px;color:#586069;background:#fff}.latest-commit .bubble-content strong{color:#555}.pulse-control{padding:15px;font-size:11px;text-align:right}.trending-text-for{padding-right:5px}.trending-text-in{padding-right:5px;padding-left:5px}.pulse-summary{margin:0 0 30px}.pulse-summary:last-of-type{margin-bottom:0}.pulse-summary .summary-title{padding:0;margin:0 0 5px;font-size:14px}.pulse-summary .bar-graph{display:table;width:100%;margin:0;border-radius:3px}.pulse-summary .bar{display:table-cell;height:15px;background-color:#6a737d}.pulse-summary .bar.closed{background-color:#cb2431}.pulse-summary .bar.open{background-color:#28a745}.pulse-summary .bar.merged{background-color:#6f42c1}.pulse-summary .bar.proposed{background-color:#28a745}.pulse-summary .summary-box{display:table;width:100%;padding:0;margin:0;color:#586069;border:1px solid #f2f2f4}.pulse-summary .summary-box li{display:table-cell;width:50%;padding:15px 0;text-align:center}.pulse-summary .summary-box li:first-child{border-right:1px solid #f2f2f4}.pulse-summary .summary-box .count{display:block;font-size:16px;color:#444}.pulse-summary .summary-box .count .octicon{margin-top:2px}.user-bar-graph{position:relative;height:103px;background:#fff}.max-commits{position:absolute;top:3px;right:15px;font-size:10px;color:#586069}.user-bar-item{position:relative;float:left;width:20px;height:75px;margin:0 5px 5px 0}.user-bar-item img{position:absolute;bottom:-28px;margin-right:5px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.user-bar{position:absolute;bottom:0;width:20px;max-height:75px;padding:0 0 3px;margin:0;font-size:12px;color:#586069;background-color:#fc9a28;border-top-left-radius:3px;border-top-right-radius:3px;opacity:0.8}.y-axis-bar{position:absolute;left:0;width:100%;height:1px;background:#eaeaea}.y-axis-bar.top{top:0}.y-axis-bar.middle{top:36px}.y-axis-bar.bottom{bottom:27px;border-color:#ccc}.bar-graph{height:30px;padding:0;margin:15px 0}.bar-graph a{position:relative;display:block;float:left;height:10px;padding:0;margin:0}.bar-graph a .label{position:absolute;bottom:-23px;font-size:13px;color:#586069}.bar-graph a:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.bar-graph a:first-child .label{left:0}.bar-graph a:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.bar-graph a:last-child .label{right:0}.file-browser-header{max-width:100%;border-bottom:1px solid #ddd}.file-browser-header>.TableObject-item{padding:15px}.file-browser-header>.TableObject-item:first-child{white-space:normal;border-right:solid 1px #ddd}.file-browser-header .octicon{color:#586069}.history-link{margin-top:4px;font-size:12px;font-weight:600;color:#586069;vertical-align:top}p.history-link{padding:15px;margin:0;font-size:13px;border-bottom:1px solid #ddd}p.history-link a{color:#586069}.blob-breadcrumb{position:relative;padding-left:40px}.blob-breadcrumb .filetype-icon{position:absolute;top:15px;left:15px}.blob-history{position:relative;display:none;color:#7b878c;background:#f5f9fc;border-bottom:1px solid #d2d9dd}.blob-history a{display:block;padding:15px 15px 15px 41px;font-size:13px;color:#0366d6}.blob-history .octicon{color:#7b878c}.blob-history .octicon-history{position:absolute;top:16px;left:15px}.blob-history .commit-ref{float:right;margin:2px 0 0 10px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;font-weight:600;color:#7b787c}.blob-history-label{float:right;color:#0366d6}.blob-history-checkbox{position:absolute;top:0;left:0;opacity:0}.blob-history-checkbox:checked ~ .blob-history{display:block}.blob-file-content{background-color:#fff}.blob-file-content pre{margin:0;overflow:scroll;word-wrap:normal;white-space:pre}.blob-file-content .code-body pre{padding:15px 0}.blob-file-content .code-body pre .line{padding:0 15px}.blob-file-content-blankslate{padding:15px;margin-top:0;margin-bottom:0}.markdown-body{padding:15px}.subscription-settings-bubble .bubble-content{padding:0 15px}.reponav-wrapper{position:relative;z-index:2;height:36px;margin-top:-1px;overflow-y:hidden;background-color:#1e2327}.reponav{padding-right:7px;padding-bottom:20px;padding-left:7px;margin-top:-6px;-webkit-overflow-scrolling:touch;overflow-x:auto;color:rgba(255,255,255,0.75);text-align:center;white-space:nowrap}.reponav-item{display:inline-block;padding:10px 8px;color:rgba(255,255,255,0.75)}.reponav-item .Counter{color:inherit;background-color:rgba(255,255,255,0.15)}.reponav-item.selected{font-weight:600;color:#fff}.server-stats{color:#586069;background:#333}.server-stats .stats{padding-left:0;margin:0}.server-stats .stats li{padding:15px;list-style:none;border-bottom:1px solid rgba(0,0,0,0.7);box-shadow:0 1px 0 rgba(255,255,255,0.1)}.server-stats a,.server-stats strong{font-weight:600;color:#fff}.server-stats .serverstats-branch{padding:15px;margin:0;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace}.server-stats .serverstats-branch .current-branch{max-width:90%}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}.profile-header{position:relative;min-height:140px;padding:15px 15px 10px 140px;overflow:visible;line-height:1.5}.profile-header .avatar{position:absolute;top:15px;left:15px;margin-right:15px;border-radius:3px}.profile-header h1{margin:0;font-size:16px;color:#333}.profile-header h3{margin:0;font-size:12px;font-weight:normal;color:#586069}.user-profile-bio{padding:0 15px 15px;white-space:pre-wrap}.user-profile-company>div{display:inline-block}.details{padding:0;margin:7.5px 0 0}.details li{margin-bottom:0;font-size:12px;line-height:1.8}.details-item{font-size:13px;line-height:24px;list-style:none}.details-item .css-truncate-target{max-width:88%}.details-item .octicon{width:16px;color:#586069;text-align:center}.user-following-container{display:block;padding:0 15px 15px}.user-following-container.loading{opacity:0.5}.user-following-container .follow,.user-following-container.on .unfollow{display:block}.user-following-container.on .follow,.user-following-container .unfollow{display:none}.language-color{position:relative;top:1px;display:inline-block;width:12px;height:12px;border-radius:50%}.profile-timeline-wrapper{position:relative;z-index:0;overflow:hidden;word-break:break-word;word-wrap:break-word;white-space:normal;background-color:#fff}.profile-timeline-wrapper .form-select{width:116px}.profile-timeline .timeline-item-icon{float:left;width:32px;height:32px;margin-top:-7px;margin-left:-40px;line-height:29px;color:#586069;text-align:center;background-color:#f6f8fa;border:2px solid #fff;border-radius:50%}.profile-timeline .profile-timeline-month-line{background-color:#fff}.profile-timeline .profile-timeline-month-line .profile-timeline-month-heading{top:-10px}.profile-timeline .profile-timeline-month-line::after{display:block;width:100%;height:1px;margin-top:-4px;content:"";background-color:#f6f8fa}.profile-timeline .profile-timeline-line::before{position:absolute;top:0;bottom:0;left:15px;z-index:-1;display:block;width:2px;content:"";background-color:#f6f8fa}.profile-timeline .profile-timeline-card-wrapper{border-top:solid 2px #fff;border-bottom:solid 2px #fff}.profile-timeline .profile-timeline-card-wrapper h4{margin:0}.profile-timeline .profile-timeline-card-footer{height:45px;line-height:45px}.profile-timeline .profile-timeline-card-footer .diffstat{position:inherit !important;top:0}.profile-timeline .progress-bar{height:10px;border-radius:2px}.profile-timeline .col-5{width:30%}.profile-rollup-wrapper .css-truncate-target{max-width:72%}.profile-rollup-icon .octicon{vertical-align:middle}.profile-rollup-event-title.css-truncate-target{max-width:100%}.profile-rollup-wrapper+.profile-rollup-wrapper{border-top:1px solid #f6f8fa}.profile-timeline-card-wrapper+.profile-timeline-card-wrapper{margin-top:8px}.profile-rollup-wrapper+.profile-timeline-card-wrapper{margin-top:0}.profile-timeline-month-line+.profile-timeline-card-wrapper{margin-top:8px}.profile-rollup-content{display:none}.profile-rollup-toggle .css-truncate-target{max-width:90%}.profile-rollup-toggle-closed{display:none}.profile-rollup-toggle-open{display:inline-block}.open .profile-rollup-content,.open .profile-rollup-toggle-closed{display:block}.open .btn-link .profile-rollup-toggle-closed{display:inline-block}.open .profile-rollup-toggle-open{display:none}.inbox-zero{padding:30px 15px;color:#586069;text-align:center;background-color:#fff;border-top:1px solid #eee}.inbox-unavailable{padding:30px 15px;color:#586069;text-align:center;background-color:#fff;border-top:1px solid #eee}.subscription-settings-bubble .form-checkbox{padding:0 15px 0 40px}.subscription-settings-bubble .form-checkbox input[type="radio"]{position:relative;top:2px}.subscription-settings-bubble .form-checkbox .note{padding-left:0}.mobile-search .list-item em,.mobile-search .list-item-title em,.mobile-search .list-item .byline em{padding:1px;padding-top:1px;font-style:normal;font-weight:600;text-shadow:none;background-color:rgba(255,255,140,0.5);border-radius:3px}.mobile-search .description{display:block;padding-bottom:5px;margin:0;font-size:12px;color:#000}.mobile-search .description strong{font-weight:normal;color:#444}.mobile-search .issue-list-item .octicon-comment-discussion{margin-left:5px;color:#586069}.mobile-search .user-list-item{min-height:73px}.mobile-search .user-list-item .user-list-info,.mobile-search .user-list-item .byline{padding-left:45px}.dashboard-search{display:block;margin:15px}.dashboard-search .dashboard-search-input{width:100%;margin:0}.topic-tag{display:inline-block;padding:0.3em 0.9em;margin:0.25em 0.5em 0.25em 0;background-color:#e7f3ff;border-radius:3px}.branch-groups{padding-top:15px;background:#fff}.branch-groups .bubble-title{background-color:#f5f5f5}.branches-list{border-bottom:1px solid #ddd}.branches-list:last-child{border-bottom:0}.branches-list .branch-name{display:inline-block;padding:2px 6px;margin-left:15px;font:12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;color:rgba(0,0,0,0.5);background-color:rgba(209,227,237,0.5);border-radius:3px}.branches-list .branch-name .octicon{margin:1px -2px 0 0;color:#b0c4ce}.branches-list a.branch-name{color:#0366d6}.branch-list-item .branch-name{max-width:80%;margin-right:10px}.branch-list-item .meta{margin-top:3px}.branch-list-item .branch-meta{display:block;margin-top:3px;margin-left:0;font-size:12px;color:#586069}.gist-mobile-blob{border-top:1px solid #ddd}.gist-meta{margin-top:15px}.render-container{padding:30px;line-height:0;text-align:center;background:#dfe2e5}.render-container .render-viewer{display:none;width:100%;height:100%;border:0}.render-container .octospinner{display:none}.render-container .render-viewer-error,.render-container .render-viewer-fatal,.render-container .render-viewer-invalid{display:none}.render-container.is-render-automatic .octospinner{display:inline-block}.render-container.is-render-requested .octospinner{display:inline-block}.render-container.is-render-requested.is-render-failed .render-viewer-error{display:inline-block}.render-container.is-render-requested.is-render-failed .render-viewer,.render-container.is-render-requested.is-render-failed .render-viewer-fatal,.render-container.is-render-requested.is-render-failed .render-viewer-invalid,.render-container.is-render-requested.is-render-failed .octospinner{display:none}.render-container.is-render-requested.is-render-failed-fatal .render-viewer-fatal{display:inline-block}.render-container.is-render-requested.is-render-failed-fatal .render-viewer,.render-container.is-render-requested.is-render-failed-fatal .render-viewer-error,.render-container.is-render-requested.is-render-failed-fatal .render-viewer-invalid,.render-container.is-render-requested.is-render-failed-fatal .octospinner{display:none}.render-container.is-render-requested.is-render-failed-invalid .render-viewer-invalid{display:inline-block}.render-container.is-render-requested.is-render-failed-invalid .render-viewer,.render-container.is-render-requested.is-render-failed-invalid .render-viewer-error,.render-container.is-render-requested.is-render-failed-invalid .render-viewer-fatal,.render-container.is-render-requested.is-render-failed-invalid .octospinner{display:none}.render-container.is-render-ready.is-render-requested:not(.is-render-failed){height:500px;padding:0;background:none}.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer{display:block}.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer-error,.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer-fatal,.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .octospinner{display:none}.render-notice{padding:20px 15px;font-size:14px;color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}
  @media (min-width: 992px) {
    .container{
      width: 980px;
      margin-right: auto;
      margin-left: auto;
      position: relative;
      margin-top: 16px;
      margin-bottom: 16px;
      border: 1px solid #ddd;
      border-radius: 3px;
    }
  }
</style>
</head>
<body><div id="readme" class="container"><article class="markdown-body entry-content"><h1 id="springcloud-finchley-">springcloud Finchley:</h1>
<p>builds and works with Spring Boot 2.0.x, and is not expected to work with Spring Boot 1.5.x.</p>
<h1 id="springcloud-dalston-and-edgware-release-trains">springcloud Dalston and Edgware release trains</h1>
<p>build on Spring Boot 1.5.x, and are not expected to work with Spring Boot 2.0.x.</p>
<h1 id="springboot-">springboot:</h1>
<ul>
<li>statble:1.5.17</li>
<li>snashot:1.5.18</li>
</ul>
<h1 id="1-">1.&#x670D;&#x52A1;&#x6CBB;&#x7406;</h1>
<ul>
<li>dubbo dubbox</li>
<li>Netflix&#x7684;Eureka:&#x53EF;&#x4EE5;&#x9009;&#x62E9;</li>
<li>etcd</li>
<li>zookeeper</li>
<li>Apache&#x7684;Consul
&#x53EF;&#x4EE5;&#x6392;&#x9664;,&#x5237;&#x65B0;&#x56F0;&#x96BE;
`&#x8FD0;&#x884C;:
consul agent -dev -ui -node=cy
consul agent -dev -http-port 8080
+*<em>&#x89E3;&#x51B3;consul&#x5728;&#x5176;&#x5B83;&#x673A;&#x5668;&#x65E0;&#x6CD5;&#x8BBF;&#x95EE;&#x7684;&#x95EE;&#x9898;:
consul agent -dev -client 0.0.0.0 *</em></li>
</ul>
<p>`
/etc/consul.d&#x76EE;&#x5F55;&#x4E0B;&#x5408;&#x5EFA;base-config.json:</p>
<p>{<br>    &quot;ports&quot;: {<br>        &quot;http&quot;: 8080
    }<br>}</p>
<p>&#x547D;&#x4EE4;&#x884C;:consul
node:&#x8282;&#x70B9;&#x540D;
Address&#xFF1A;&#x8282;&#x70B9;&#x5730;&#x5740;
Status&#xFF1A;alive&#x8868;&#x793A;&#x8282;&#x70B9;&#x5065;&#x5EB7;
Type&#xFF1A;server&#x8FD0;&#x884C;&#x72B6;&#x6001;&#x662F;server&#x72B6;&#x6001;
DC&#xFF1A;dc1&#x8868;&#x793A;&#x8BE5;&#x8282;&#x70B9;&#x5C5E;&#x4E8E;DataCenter1
eureka 1x&#x5F00;&#x6E90;,2x&#x8981;&#x95ED;&#x6E90;&#x4E86;.&#x53EF;&#x4EE5;&#x9009;&#x62E9;consul. &#x5EFA;&#x8BAE;&#x5927;&#x6846;&#x67B6;&#x4F7F;&#x7528;kubernetes.
consul agent&#x5E38;&#x7528;&#x547D;&#x4EE4;&#x89E3;&#x8BFB;
-data-dir
&#x4F5C;&#x7528;&#xFF1A;&#x6307;&#x5B9A;agent&#x50A8;&#x5B58;&#x72B6;&#x6001;&#x7684;&#x6570;&#x636E;&#x76EE;&#x5F55;&#xFF0C;&#x8FD9;&#x662F;&#x6240;&#x6709;agent&#x90FD;&#x5FC5;&#x987B;&#x7684;,&#x5BF9;server&#x5C24;&#x5176;&#x91CD;&#x8981;&#xFF0C;&#x56E0;&#x4E3A;&#x4ED6;&#x4EEC;&#x5FC5;&#x987B;&#x6301;&#x4E45;&#x5316;&#x96C6;&#x7FA4;&#x7684;&#x72B6;&#x6001;</p>
<p>-config-dir
&#x4F5C;&#x7528;&#xFF1A;&#x6307;&#x5B9A;service&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x548C;&#x68C0;&#x67E5;&#x5B9A;&#x4E49;&#x6240;&#x5728;&#x7684;&#x4F4D;&#x7F6E;&#x3002;&#x76EE;&#x5F55;&#x5FC5;&#x9700;&#x4E3A;consul.d&#xFF0C;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x90FD;&#x662F;json&#x683C;&#x5F0F;&#x7684;&#x6570;&#x636E;&#x3002;&#x914D;&#x7F6E;&#x8BE6;&#x89E3;&#x89C1;&#x5B98;&#x65B9;</p>
<p>-config-file
&#x4F5C;&#x7528;&#xFF1A;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x8981;&#x88C5;&#x8F7D;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;</p>
<p>-dev
&#x4F5C;&#x7528;&#xFF1A;&#x5F00;&#x53D1;&#x670D;&#x52A1;&#x5668;&#x6A21;&#x5F0F;,&#x867D;&#x7136;&#x662F;server&#x6A21;&#x5F0F;&#xFF0C;&#x4F46;&#x4E0D;&#x7528;&#x4E8E;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#xFF0C;&#x56E0;&#x4E3A;&#x4E0D;&#x4F1A;&#x6709;&#x4EFB;&#x4F55;&#x6301;&#x4E45;&#x5316;&#x64CD;&#x4F5C;&#xFF0C;&#x5373;&#x4E0D;&#x4F1A;&#x6709;&#x4EFB;&#x4F55;&#x6570;&#x636E;&#x5199;&#x5165;&#x5230;&#x78C1;&#x76D8;</p>
<p>-bootstrap-expect
&#x4F5C;&#x7528;&#xFF1A; &#x53C2;&#x6570;&#x8868;&#x660E;&#x8BE5;&#x670D;&#x52A1;&#x8FD0;&#x884C;&#x65F6;&#x6700;&#x4F4E;&#x5F00;&#x59CB;&#x8FDB;&#x884C;&#x9009;&#x4E3E;&#x7684;&#x8282;&#x70B9;&#x6570;&#xFF0C;&#x5F53;&#x8BBE;&#x7F6E;&#x4E3A;1&#x65F6;&#xFF0C;&#x5219;&#x610F;&#x5473;&#x5141;&#x8BB8;&#x8282;&#x70B9;&#x4E3A;&#x4E00;&#x4E2A;&#x65F6;&#x4E5F;&#x8FDB;&#x884C;&#x9009;&#x4E3E;&#xFF1B;&#x5F53;&#x8BBE;&#x7F6E;&#x4E3A;3&#x65F6;&#xFF0C;&#x5219;&#x7B49;&#x5230;3&#x53F0;&#x8282;&#x70B9;&#x540C;&#x65F6;&#x8FD0;&#x884C;consul&#x5E76;&#x52A0;&#x5165;&#x5230;server&#x624D;&#x80FD;&#x53C2;&#x4E0E;&#x9009;&#x4E3E;&#xFF0C;&#x9009;&#x4E3E;&#x5B8C;&#x96C6;&#x7FA4;&#x624D;&#x80FD;&#x591F;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x3002; &#x4E00;&#x822C;&#x5EFA;&#x8BAE;&#x670D;&#x52A1;&#x5668;&#x7ED3;&#x70B9;3-5&#x4E2A;&#x3002;</p>
<p>-node
&#x4F5C;&#x7528;&#xFF1A;&#x6307;&#x5B9A;&#x8282;&#x70B9;&#x5728;&#x96C6;&#x7FA4;&#x4E2D;&#x7684;&#x540D;&#x79F0;&#xFF0C;&#x8BE5;&#x540D;&#x79F0;&#x5728;&#x96C6;&#x7FA4;&#x4E2D;&#x5FC5;&#x987B;&#x662F;&#x552F;&#x4E00;&#x7684;&#xFF08;&#x9ED8;&#x8BA4;&#x8FD9;&#x662F;&#x673A;&#x5668;&#x7684;&#x4E3B;&#x673A;&#x540D;&#xFF09;&#xFF0C;&#x76F4;&#x63A5;&#x91C7;&#x7528;&#x673A;&#x5668;&#x7684;IP</p>
<p>-bind
&#x4F5C;&#x7528;&#xFF1A;&#x6307;&#x660E;&#x8282;&#x70B9;&#x7684;IP&#x5730;&#x5740;&#xFF0C;&#x4E00;&#x822C;&#x662F;0.0.0.0&#x6216;&#x8005;&#x4E91;&#x670D;&#x52A1;&#x5668;&#x5185;&#x7F51;&#x5730;&#x5740;&#xFF0C;&#x4E0D;&#x80FD;&#x5199;&#x963F;&#x91CC;&#x4E91;&#x5916;&#x7F51;&#x5730;&#x5740;&#x3002;&#x8FD9;&#x662F;Consul&#x4FA6;&#x542C;&#x7684;&#x5730;&#x5740;&#xFF0C;&#x5B83;&#x5FC5;&#x987B;&#x53EF;&#x4EE5;&#x88AB;&#x96C6;&#x7FA4;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x5176;&#x4ED6;&#x8282;&#x70B9;&#x8BBF;&#x95EE;&#x3002;&#x867D;&#x7136;&#x7ED1;&#x5B9A;&#x5730;&#x5740;&#x4E0D;&#x662F;&#x7EDD;&#x5BF9;&#x5FC5;&#x8981;&#x7684;&#xFF0C;&#x4F46;&#x6700;&#x597D;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x3002;</p>
<p>-server
&#x4F5C;&#x7528;&#xFF1A;&#x6307;&#x5B9A;&#x8282;&#x70B9;&#x4E3A;server,&#x6BCF;&#x4E2A;&#x6570;&#x636E;&#x4E2D;&#x5FC3;&#xFF08;DC&#xFF09;&#x7684;server&#x6570;&#x63A8;&#x8350;3-5&#x4E2A;&#x3002;</p>
<p>-client
&#x4F5C;&#x7528;&#xFF1A;&#x6307;&#x5B9A;&#x8282;&#x70B9;&#x4E3A;client&#xFF0C;&#x6307;&#x5B9A;&#x5BA2;&#x6237;&#x7AEF;&#x63A5;&#x53E3;&#x7684;&#x7ED1;&#x5B9A;&#x5730;&#x5740;&#xFF0C;&#x5305;&#x62EC;&#xFF1A;HTTP&#x3001;DNS&#x3001;RPC
&#x9ED8;&#x8BA4;&#x662F;127.0.0.1&#xFF0C;&#x53EA;&#x5141;&#x8BB8;&#x56DE;&#x73AF;&#x63A5;&#x53E3;&#x8BBF;&#x95EE;</p>
<p>10.-datacenter
&#x4F5C;&#x7528;&#xFF1A;&#x6307;&#x5B9A;&#x673A;&#x5668;&#x52A0;&#x5165;&#x5230;&#x54EA;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x4E2D;&#x5FC3;&#x4E2D;&#x3002;&#x8001;&#x7248;&#x672C;&#x53EB;-dc&#xFF0C;-dc&#x5DF2;&#x7ECF;&#x5931;&#x6548;</p>
<h1 id="2-">2&#x3001;&#x5206;&#x5E03;&#x5F0F;&#x914D;&#x7F6E;&#x7BA1;&#x7406;</h1>
<ul>
<li>&#x767E;&#x5EA6;&#x7684;Disconf</li>
<li>360&#x7684;QConf</li>
<li>&#x6DD8;&#x5B9D;&#x7684;Diamond:&#x8FC7;&#x4E8E;&#x7B80;&#x964B;</li>
<li>spring cloud config: &#x662F;&#x9759;&#x6001;&#x7684;&#xFF0C;&#x5F97;&#x914D;&#x5408;Spring Cloud Bus&#x5B9E;&#x73B0;&#x52A8;&#x6001;&#x7684;&#x914D;&#x7F6E;&#x66F4;&#x65B0;&#x3002;</li>
<li>&#x5F53;&#x5F53;&#x7684;apollo</li>
</ul>
<p>&#x8BF4;&#x660E;: spring cloud config &#x4E2D;&#x914D;&#x7F6E;&#x7684;&#x81EA;&#x52A8;&#x5237;&#x65B0;&#x8FD8;&#x662F;&#x6709;&#x70B9;&#x95EE;&#x9898;: &#x8981;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;,&#x5FC5;&#x987B;&#x4F7F;&#x7528;rabbitmq,acuator,&#x4FEE;&#x6539;&#x914D;&#x7F6E;&#x540E;&#x8FD8;&#x9700;&#x8981;&#x5411;client/refresh&#x53D1;&#x9001;&#x4E00;&#x4E2A;post&#x8BF7;&#x6C42;,&#x624D;&#x80FD;&#x5237;&#x65B0;&#x914D;&#x7F6E;,&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;. &#x53E6;&#x4E00;&#x4E2A;&#x65B9;&#x5F0F;&#x662F;git&#x914D;&#x7F6E;hook,&#x7EF4;&#x62A4;&#x5B9E;&#x73B0;&#x4E0A;&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;.</p>
<p>&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;apollo.</p>
<h1 id="3-">3.&#x6279;&#x91CF;&#x4EFB;&#x52A1;&#x6846;&#x67B6;</h1>
<ul>
<li>&#xFF08;1&#xFF09;Spring Cloud&#x7EC4;&#x4EF6;&#x4E2D;&#x7684;Task</li>
<li>&#xFF08;2&#xFF09;LTS</li>
</ul>
<h1 id="4-">4.&#x5BA2;&#x6237;&#x7AEF;&#x8D1F;&#x8F7D;&#x5747;&#x8861;</h1>
<ul>
<li>Ribbon</li>
<li>Feign:&#x58F0;&#x660E;&#x5F0F;&#x670D;&#x52A1;&#x8C03;&#x7528;&#xFF0C;&#x672C;&#x8D28;&#x4E0A;&#x5C31;&#x662F;Ribbon+Hystrix ,&#x65B9;&#x4FBF;&#x6211;&#x4EEC;&#x7A0B;&#x5E8F;&#x5458;&#x4E9B;&#x66F4;&#x4F18;&#x7F8E;&#x7684;&#x4EE3;&#x7801;&#x7684;&#x3002; &#x5EFA;&#x8BAE;&#x4F7F;&#x7528;feign</li>
</ul>
<h1 id="5-">5.&#x670D;&#x52A1;&#x964D;&#x7EA7;</h1>
<p>Hystrix:&#x5BA2;&#x6237;&#x7AEF;&#x5BB9;&#x9519;&#x4FDD;&#x62A4;&#xFF0C;&#x7279;&#x6027;&#x6709;&#x670D;&#x52A1;&#x964D;&#x7EA7;&#x3001;&#x670D;&#x52A1;&#x7194;&#x65AD;&#x3001;&#x8BF7;&#x6C42;&#x7F13;&#x5B58;&#x3001;&#x8BF7;&#x6C42;&#x5408;&#x5E76;&#x3001;&#x4F9D;&#x8D56;&#x9694;&#x79BB;&#x3002;</p>
<pre><code>&#x65AD;&#x8DEF;&#x5668;&#x589E;&#x52A0;&#x4E86;&#x7A33;&#x5B9A;&#x6027;&#x548C;&#x7075;&#x6D3B;&#x6027;&#xFF0C;&#x4EE5;&#x4E00;&#x4E2A;&#x7CFB;&#x7EDF;&#xFF0C;&#x63D0;&#x4F9B;&#x7A33;&#x5B9A;&#x6027;&#xFF0C;&#x800C;&#x7CFB;&#x7EDF;&#x4ECE;&#x6545;&#x969C;&#x4E2D;&#x6062;&#x590D;&#xFF0C;&#x5E76;&#x5C3D;&#x91CF;&#x51CF;&#x5C11;&#x6B64;&#x6545;&#x969C;&#x7684;&#x5BF9;&#x6027;&#x80FD;&#x7684;&#x5F71;&#x54CD;&#x3002;&#x5B83;&#x53EF;&#x4EE5;&#x5E2E;&#x52A9;&#x5FEB;&#x901F;&#x5730;&#x62D2;&#x7EDD;&#x5BF9;&#x4E00;&#x4E2A;&#x64CD;&#x4F5C;&#xFF0C;&#x5373;&#x5F88;&#x53EF;&#x80FD;&#x5931;&#x8D25;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7B49;&#x5F85;&#x64CD;&#x4F5C;&#x8D85;&#x65F6;&#xFF08;&#x6216;&#x8005;&#x4E0D;&#x8FD4;&#x56DE;&#xFF09;&#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x4EE5;&#x4FDD;&#x6301;&#x7CFB;&#x7EDF;&#x7684;&#x54CD;&#x5E94;&#x65F6;&#x95F4;&#x3002;&#x5982;&#x679C;&#x65AD;&#x8DEF;&#x5668;&#x63D0;&#x9AD8;&#x6BCF;&#x6B21;&#x6539;&#x53D8;&#x72B6;&#x6001;&#x7684;&#x65F6;&#x95F4;&#x7684;&#x4E8B;&#x4EF6;&#xFF0C;&#x8BE5;&#x4FE1;&#x606F;&#x53EF;&#x4EE5;&#x88AB;&#x7528;&#x6765;&#x76D1;&#x6D4B;&#x7531;&#x65AD;&#x8DEF;&#x5668;&#x4FDD;&#x62A4;&#x7CFB;&#x7EDF;&#x7684;&#x90E8;&#x4EF6;&#x7684;&#x5065;&#x5EB7;&#x72B6;&#x51B5;&#xFF0C;&#x6216;&#x4EE5;&#x63D0;&#x9192;&#x7BA1;&#x7406;&#x5458;&#x5F53;&#x65AD;&#x8DEF;&#x5668;&#x8DF3;&#x95F8;&#xFF0C;&#x4EE5;&#x5728;&#x6253;&#x5F00;&#x72B6;&#x6001;&#x3002;</code></pre><p>Hystrix Dashboard:&#x76D1;&#x63A7;&#x663E;&#x793A; &#x4EEA;&#x8868;&#x76D8;&#xFF0C;&#x76D1;&#x63A7;&#x96C6;&#x7FA4;&#x6A21;&#x5F0F;&#x548C;&#x5355;&#x70B9;&#x6A21;&#x5F0F;&#xFF0C;&#x5176;&#x4E2D;&#x96C6;&#x7FA4;&#x6A21;&#x5F0F;&#x9700;&#x8981;&#x6536;&#x96C6;&#x5668;Turbine&#x914D;&#x5408;</p>
<p>Turbine: &#x662F;&#x96C6;&#x7FA4;&#x6536;&#x96C6;&#x5668;&#xFF0C;&#x670D;&#x52A1;&#x4E8E;Dashboard&#x7684;&#x3002;</p>
<h1 id="6-">6.&#x7F51;&#x5173;</h1>
<p>Spring Cloud Zuul: API&#x670D;&#x52A1;&#x7F51;&#x5173;&#xFF0C;&#x529F;&#x80FD;&#x6709;&#x8DEF;&#x7531;&#x5206;&#x53D1;&#x548C;&#x8FC7;&#x6EE4;&#x3002;
Zuul&#x7684;&#x4E3B;&#x8981;&#x529F;&#x80FD;&#x662F;&#x8DEF;&#x7531;&#x8F6C;&#x53D1;&#x548C;&#x8FC7;&#x6EE4;&#x5668;&#x3002;&#x8DEF;&#x7531;&#x529F;&#x80FD;&#x662F;&#x5FAE;&#x670D;&#x52A1;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x6BD4;&#x5982;&#xFF0F;api/user&#x8F6C;&#x53D1;&#x5230;&#x5230;user&#x670D;&#x52A1;&#xFF0C;/api/shop&#x8F6C;&#x53D1;&#x5230;&#x5230;shop&#x670D;&#x52A1;&#x3002;zuul&#x9ED8;&#x8BA4;&#x548C;Ribbon&#x7ED3;&#x5408;&#x5B9E;&#x73B0;&#x4E86;&#x8D1F;&#x8F7D;&#x5747;&#x8861;&#x7684;&#x529F;&#x80FD;&#x3002;
zuul&#x6709;&#x4EE5;&#x4E0B;&#x529F;&#x80FD;&#xFF1A;</p>
<ul>
<li>Authentication</li>
<li>Insights</li>
<li>Stress Testing</li>
<li>Canary Testing</li>
<li>Dynamic Routing</li>
<li>Service Migration</li>
<li>Load Shedding</li>
<li>Security</li>
<li>Static Response handling</li>
<li>Active/Active traffic management</li>
</ul>
<h1 id="7-">7.&#x7CFB;&#x7EDF;&#x603B;&#x7EBF;</h1>
<p>RabbitMQ</p>
<p>Kafka</p>
<p>Spring Cloud Bus : config&#x4FEE;&#x6539;&#x5B8C;&#x914D;&#x7F6E;&#x540E;&#x5404;&#x4E2A;&#x7ED3;&#x70B9;&#x90FD;&#x8981;refresh&#x624D;&#x80FD;&#x751F;&#x6548;&#x5B9E;&#x5728;&#x592A;&#x9EBB;&#x70E6;&#xFF0C;&#x6240;&#x4EE5;&#x4EA4;&#x7ED9;bus&#x6765;&#x901A;&#x77E5;&#x670D;&#x52A1;&#x8282;&#x70B9;&#x5237;&#x65B0;&#x914D;&#x7F6E;&#x7684;&#x3002; &#x4E00;&#x79CD;&#x6700;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x5F0F;&#x91CD;&#x65B0;&#x4E00;&#x4E0B;Config Client&#x8FDB;&#x884C;&#x91CD;&#x65B0;&#x83B7;&#x53D6;&#xFF0C;&#x4F46;Spring Cloud&#x7EDD;&#x5BF9;&#x4E0D;&#x4F1A;&#x8BA9;&#x4F60;&#x8FD9;&#x6837;&#x505A;&#x7684;&#xFF0C;Spring Cloud Bus&#x6B63;&#x662F;&#x63D0;&#x4F9B;&#x4E00;&#x79CD;&#x64CD;&#x4F5C;&#x4F7F;&#x5F97;&#x6211;&#x4EEC;&#x5728;&#x4E0D;&#x5173;&#x95ED;&#x670D;&#x52A1;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x66F4;&#x65B0;&#x6211;&#x4EEC;&#x7684;&#x914D;&#x7F6E;&#x3002;</p>
<p>&#x6D88;&#x8D39;&#x4F7F;&#x7528;amqpRestTemplate&#x975E;&#x5E38;&#x65B9;&#x4FBF;.</p>
<h1 id="-stream">&#xFF18;.Stream</h1>
<p>&#x7B80;&#x5316;&#x7814;&#x53D1;&#x4EBA;&#x5458;&#x5BF9;MQ&#x4F7F;&#x7528;&#x7684;&#x590D;&#x6742;&#x5EA6;&#xFF0C;&#x5F31;&#x5316;MQ&#x7684;&#x5DEE;&#x5F02;&#x6027;&#xFF0C;&#x8FBE;&#x5230;&#x7A0B;&#x5E8F;&#x548C;MQ&#x677E;&#x8026;&#x5408;&#x3002; &#x6D88;&#x606F;&#x9A71;&#x52A8;&#xFF0C;&#x6709;Sink&#x3001;Source&#x3001;Processor&#x4E09;&#x79CD;&#x901A;&#x9053;&#xFF0C;&#x7279;&#x6027;&#x6709;&#x8BA2;&#x9605;&#x53D1;&#x5E03;&#x3001;&#x6D88;&#x8D39;&#x7EC4;&#x3001;&#x6D88;&#x606F;&#x5206;&#x533A;&#x3002;
&#x76EE;&#x524D;&#x4E3A;&#x6B62;Spring Cloud Stream&#x53EA;&#x652F;&#x6301;&#x4E0B;&#x9762;&#x4E24;&#x4E2A;&#x8457;&#x540D;&#x7684;&#x6D88;&#x606F;&#x4E2D;&#x95F4;&#x4EF6;&#x7684;&#x81EA;&#x52A8;&#x5316;&#x914D;&#x7F6E;&#xFF1A;</p>
<ul>
<li>RabbitMQ</li>
<li>Kafka</li>
</ul>
<p><strong>rabbitmq &#x542F;&#x52A8;:service rabbitmq-server start</strong></p>
<h2 id="topic-">topic&#x8BBE;&#x7F6E;:</h2>
<p>spring.cloud.stream.bindings.input.destination=sms</p>
<h2 id="-">&#x666E;&#x901A;&#x8BBE;&#x7F6E;</h2>
<p>spring.rabbitmq.host=192.168.0.37
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest</p>
<h2 id="-">&#x6D88;&#x8D39;&#x7EC4;:&#x6D88;&#x606F;&#x751F;&#x4EA7;&#x8005;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x7ED9;&#x67D0;&#x4E2A;&#x5177;&#x4F53;&#x5FAE;&#x670D;&#x52A1;&#x65F6;&#xFF0C;&#x53EA;&#x5E0C;&#x671B;&#x88AB;&#x6D88;&#x8D39;&#x4E00;&#x6B21;,&#x540C;&#x65F6;&#x8D1F;&#x8F7D;&#x5747;&#x8861;</h2>
<p>spring.cloud.stream.bindings.input.group:&#x53EA;&#x4F1A;&#x6709;&#x4E00;&#x4E2A;&#x6D88;&#x8D39;&#x8005;&#x4F1A;&#x6536;&#x5230;&#x6D88;&#x606F;
&#x5F53;&#x6211;&#x4EEC;&#x6CA1;&#x6709;&#x4E3A;&#x5E94;&#x7528;&#x6307;&#x5B9A;&#x6D88;&#x8D39;&#x7EC4;&#x7684;&#x65F6;&#x5019;&#xFF0C;Spring Cloud Stream&#x4F1A;&#x4E3A;&#x5176;&#x5206;&#x914D;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x533F;&#x540D;&#x6D88;&#x8D39;&#x7EC4;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x5982;&#x679C;&#x540C;&#x4E00;&#x4E3B;&#x9898;&#x4E0B;&#x6240;&#x6709;&#x7684;&#x5E94;&#x7528;&#x90FD;&#x6CA1;&#x6709;&#x6307;&#x5B9A;&#x6D88;&#x8D39;&#x7EC4;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5F53;&#x6709;&#x6D88;&#x606F;&#x88AB;&#x53D1;&#x5E03;&#x4E4B;&#x540E;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x5E94;&#x7528;&#x90FD;&#x4F1A;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x6D88;&#x8D39;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x5404;&#x81EA;&#x90FD;&#x5C5E;&#x4E8E;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x7EC4;&#x4E2D;&#x3002;&#x5927;&#x90E8;&#x5206;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6211;&#x4EEC;&#x5728;&#x521B;&#x5EFA;Spring Cloud Stream&#x5E94;&#x7528;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5EFA;&#x8BAE;&#x6700;&#x597D;&#x4E3A;&#x5176;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x6D88;&#x8D39;&#x7EC4;&#xFF0C;&#x4EE5;&#x9632;&#x6B62;&#x5BF9;&#x6D88;&#x606F;&#x7684;&#x91CD;&#x590D;&#x5904;&#x7406;&#xFF0C;&#x9664;&#x975E;&#x8BE5;&#x884C;&#x4E3A;&#x9700;&#x8981;&#x8FD9;&#x6837;&#x505A;&#xFF08;&#x6BD4;&#x5982;&#xFF1A;&#x5237;&#x65B0;&#x6240;&#x6709;&#x5B9E;&#x4F8B;&#x7684;&#x914D;&#x7F6E;&#x7B49;&#xFF09;</p>
<p>##
spring.cloud.stream.bindings.example-topic.group=aaa</p>
<h2 id="-">&#x6D88;&#x606F;&#x5206;&#x533A;</h2>
<p>&#x5F53;&#x751F;&#x4EA7;&#x8005;&#x5C06;&#x6D88;&#x606F;&#x6570;&#x636E;&#x53D1;&#x9001;&#x7ED9;&#x591A;&#x4E2A;&#x6D88;&#x8D39;&#x8005;&#x5B9E;&#x4F8B;&#x65F6;&#xFF0C;&#x4FDD;&#x8BC1;&#x62E5;&#x6709;&#x5171;&#x540C;&#x7279;&#x5F81;&#x7684;&#x6D88;&#x606F;&#x6570;&#x636E;&#x59CB;&#x7EC8;&#x662F;&#x7531;&#x540C;&#x4E00;&#x4E2A;&#x6D88;&#x8D39;&#x8005;&#x5B9E;&#x4F8B;&#x63A5;&#x6536;&#x548C;&#x5904;&#x7406;&#x3002;
spring.cloud.stream.bindings.input.consumer.partitioned&#xFF1A;
   &#x901A;&#x8FC7;&#x8BE5;&#x53C2;&#x6570;&#x5F00;&#x542F;&#x6D88;&#x8D39;&#x8005;&#x5206;&#x533A;&#x529F;&#x80FD;&#xFF1B;</p>
<p>spring.cloud.stream.instanceCount&#xFF1A;
   &#x8BE5;&#x53C2;&#x6570;&#x6307;&#x5B9A;&#x4E86;&#x5F53;&#x524D;&#x6D88;&#x8D39;&#x8005;&#x7684;&#x603B;&#x5B9E;&#x4F8B;&#x6570;&#x91CF;&#xFF1B;</p>
<p>spring.cloud.stream.instanceIndex&#xFF1A;
   &#x8BE5;&#x53C2;&#x6570;&#x8BBE;&#x7F6E;&#x5F53;&#x524D;&#x5B9E;&#x4F8B;&#x7684;&#x7D22;&#x5F15;&#x53F7;&#xFF0C;&#x4ECE;0&#x5F00;&#x59CB;&#xFF0C;&#x6700;&#x5927;&#x503C;&#x4E3A;spring.cloud.stream.instanceCount&#x53C2;&#x6570; - 1&#x3002;&#x6211;&#x4EEC;&#x8BD5;&#x9A8C;&#x7684;&#x65F6;&#x5019;&#x9700;&#x8981;&#x542F;&#x52A8;&#x591A;&#x4E2A;&#x5B9E;&#x4F8B;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD0;&#x884C;&#x53C2;&#x6570;&#x6765;&#x4E3A;&#x4E0D;&#x540C;&#x5B9E;&#x4F8B;&#x8BBE;&#x7F6E;&#x4E0D;&#x540C;&#x7684;&#x7D22;&#x5F15;&#x503C;&#x3002;
   spring.cloud.stream.bindings.output.destination=greetings
   spring.cloud.stream.bindings.output.producer.partitionKeyExpression=payload
   spring.cloud.stream.bindings.output.producer.partitionCount=2</p>
<h1 id="9-sleuth">9.sleuth</h1>
<p><a href="http://blog.csdn.net/forezp/article/details/70162074">http://blog.csdn.net/forezp/article/details/70162074</a>
Spring Cloud Sleuth &#x4E3B;&#x8981;&#x529F;&#x80FD;&#x5C31;&#x662F;&#x5728;&#x5206;&#x5E03;&#x5F0F;&#x7CFB;&#x7EDF;&#x4E2D;&#x63D0;&#x4F9B;&#x8FFD;&#x8E2A;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x5E76;&#x4E14;&#x517C;&#x5BB9;&#x652F;&#x6301;&#x4E86; zipkin.
&#x5206;&#x5E03;&#x5F0F;&#x670D;&#x52A1;&#x8FFD;&#x8E2A;&#xFF0C;&#x9700;&#x8981;&#x641E;&#x6E05;&#x695A;TraceID&#x548C;SpanID&#x4EE5;&#x53CA;&#x62BD;&#x6837;&#xFF0C;&#x5982;&#x4F55;&#x4E0E;ELK&#x6574;&#x5408;&#x3002; &#x5355;&#x6B21;&#x8BF7;&#x6C42;&#x5728;&#x5FAE;&#x670D;&#x52A1;&#x8282;&#x70B9;&#x4E2D;&#x8DF3;&#x8F6C;&#x65E0;&#x6CD5;&#x8FFD;&#x6EAF;&#xFF0C;&#x89E3;&#x51B3;&#x4EFB;&#x52A1;&#x94FE;&#x65E5;&#x5FD7;&#x8FFD;&#x8E2A;&#x95EE;&#x9898;&#x7684;&#x3002;</p>
<p><strong>Spring Cloud Sleuth&#x662F;&#x5BF9;Zipkin&#x7684;&#x4E00;&#x4E2A;&#x5C01;&#x88C5;&#xFF0C;&#x5BF9;&#x4E8E;Span&#x3001;Trace&#x7B49;&#x4FE1;&#x606F;&#x7684;&#x751F;&#x6210;&#x3001;&#x63A5;&#x5165;HTTP Request&#xFF0C;&#x4EE5;&#x53CA;&#x5411;Zipkin Server&#x53D1;&#x9001;&#x91C7;&#x96C6;&#x4FE1;&#x606F;&#x7B49;&#x5168;&#x90E8;&#x81EA;&#x52A8;&#x5B8C;&#x6210;&#x3002;</strong></p>
<h1 id="10-zipkin">10 Zipkin</h1>
<p><a href="http://blog.didispace.com/spring-cloud-starter-dalston-8-4/">http://blog.didispace.com/spring-cloud-starter-dalston-8-4/</a>
<a href="https://blog.csdn.net/forezp/article/details/70162074">https://blog.csdn.net/forezp/article/details/70162074</a>
&#x5728;&#x5B9E;&#x9645;&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;&#x4E2D;&#xFF0C;Zipkin&#x53EF;&#x4EE5;&#x7ED3;&#x5408;&#x538B;&#x529B;&#x6D4B;&#x8BD5;&#x5DE5;&#x5177;&#x4E00;&#x8D77;&#x4F7F;&#x7528;&#xFF0C;&#x5206;&#x6790;&#x7CFB;&#x7EDF;&#x5728;&#x5927;&#x538B;&#x529B;&#x4E0B;&#x7684;&#x53EF;&#x7528;&#x6027;&#x548C;&#x6027;&#x80FD;&#x3002;</p>
<p>&#x4ECE;jar&#x5305;&#x548C;&#x5305;&#x540D;&#x6765;&#x770B;&#x5B83;&#x4E0D;&#x5C5E;&#x4E8E;Spring Cloud&#x7684;&#x4E00;&#x5458;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x4E0E;Spring Cloud Sleuth&#x7684;&#x62BD;&#x6837;&#x65E5;&#x5FD7;&#x7ED3;&#x5408;&#x7684;&#x5929;&#x8863;&#x65E0;&#x7F1D;&#x3002;&#x4E4D;&#x4E00;&#x770B;&#x5B83;&#x4E0E;Hystrix&#x7684;Dashboard&#x4F5C;&#x7528;&#x6709;&#x91CD;&#x53E0;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x4F46;&#x662F;&#x4ED6;&#x4EEC;&#x7684;&#x4FA7;&#x91CD;&#x70B9;&#x5B8C;&#x5168;&#x4E0D;&#x540C;&#x3002;Dashboard&#x4FA7;&#x91CD;&#x7684;&#x662F;&#x5355;&#x4E2A;&#x670D;&#x52A1;&#x7684;&#x7EDF;&#x8BA1;&#x548C;&#x662F;&#x5426;&#x53EF;&#x7528;&#xFF0C;Zipkin&#x4FA7;&#x91CD;&#x7684;&#x76D1;&#x63A7;&#x73AF;&#x8282;&#x65F6;&#x957F;&#x3002;&#x7B80;&#x8A00;&#x4E4B;&#xFF0C;Dashboard&#x4FA7;&#x91CD;&#x6545;&#x969C;&#x8BCA;&#x65AD;&#xFF0C;Ziokin&#x4FA7;&#x91CD;&#x6027;&#x80FD;&#x4F18;&#x5316;&#x3002;</p>
<p>&#x9488;&#x5BF9;&#x670D;&#x52A1;&#x5316;&#x5E94;&#x7528;&#x5168;&#x94FE;&#x8DEF;&#x8FFD;&#x8E2A;&#x7684;&#x95EE;&#x9898;&#xFF0C;Google&#x53D1;&#x8868;&#x4E86;Dapper&#x8BBA;&#x6587;&#xFF0C;&#x4ECB;&#x7ECD;&#x4E86;&#x4ED6;&#x4EEC;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x670D;&#x52A1;&#x8FFD;&#x8E2A;&#x5206;&#x6790;&#x3002;&#x5176;&#x57FA;&#x672C;&#x601D;&#x8DEF;&#x662F;&#x5728;&#x670D;&#x52A1;&#x8C03;&#x7528;&#x7684;&#x8BF7;&#x6C42;&#x548C;&#x54CD;&#x5E94;&#x4E2D;&#x52A0;&#x5165;ID&#xFF0C;&#x6807;&#x660E;&#x4E0A;&#x4E0B;&#x6E38;&#x8BF7;&#x6C42;&#x7684;&#x5173;&#x7CFB;&#x3002;&#x5229;&#x7528;&#x8FD9;&#x4E9B;&#x4FE1;&#x606F;&#xFF0C;&#x53EF;&#x4EE5;&#x53EF;&#x89C6;&#x5316;&#x5730;&#x5206;&#x6790;&#x670D;&#x52A1;&#x8C03;&#x7528;&#x94FE;&#x8DEF;&#x548C;&#x670D;&#x52A1;&#x95F4;&#x7684;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;.</p>
<p>&#x5BF9;&#x5E94;Dpper&#x7684;&#x5F00;&#x6E90;&#x5B9E;&#x73B0;&#x662F;Zipkin&#xFF0C;&#x652F;&#x6301;&#x591A;&#x79CD;&#x8BED;&#x8A00;&#x5305;&#x62EC;JavaScript&#xFF0C;Python&#xFF0C;Java, Scala, Ruby, C#, Go&#x7B49;&#x3002;</p>
<p>&#x5E94;&#x7528;&#x5B9E;&#x73B0;:
 1.&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;server,&#x5F15;&#x7528;zipken-server
 2.&#x5EFA;&#x7ACB;&#x5BA2;&#x6237;&#x7AEF;,&#x5F15;&#x5165; sleuth-zipken,&#x540C;&#x65F6;&#x5728;&#x914D;&#x7F6E;&#x4E2D;&#x586B;&#x5199;zipken-server&#x4E2D;&#x7684;&#x5730;&#x5740;
 3.&#x8FD8;&#x53EF;&#x4EE5;&#x7528;&#x6D88;&#x606F;&#x4E2D;&#x95F4;&#x4EF6;&#x5B9E;&#x73B0;&#x6D88;&#x606F;&#x6536;&#x96C6;
 &#x5F15;&#x5165;  spring-cloud-sleuth-stream &#x53CA; spring-cloud-starter-stream-rabbit
 &#x914D;&#x7F6E;&#x4E2D;&#x589E;&#x52A0;rabbitmq&#x7684;&#x914D;&#x7F6E;</p>
<h1 id="springcloud-kubernetes-">SpringCloud &#x4E0E;kubernetes &#x6BD4;&#x8F83;:</h1>
<p>&#x5FAE;&#x670D;&#x52A1; | Spring Cloud &#x548C; Kubernetes &#x54EA;&#x4E2A;&#x66F4;&#x597D;?</p>
<p>&#x5FAE;&#x670D;&#x52A1;&#x8981;&#x6C42;&#x6216;&#x7279;&#x70B9;: &#x96C6;&#x6210;&#xFF0C;&#x6269;&#x5C55;&#x6027;&#xFF0C;&#x9AD8;&#x53EF;&#x7528;&#xFF0C;&#x81EA;&#x6108;</p>
<p>Spring Cloud &#x53EF;&#x4EE5;&#x7528;&#x6765;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x57FA;&#x4E8E;&#x5FAE;&#x670D;&#x52A1;&#x7684;&#x7CFB;&#x7EDF;&#x7684;&#x7EFC;&#x5408;&#x89C6;&#x89D2;&#x3002;&#x4E3A;&#x4E86;&#x6784;&#x5EFA;&#x4E00;&#x4E2A;&#x80FD;&#x6269;&#x5C55;&#x5230;&#x6570;&#x5343;&#x4E2A;&#x670D;&#x52A1;&#x7684;&#x53EF;&#x6269;&#x5C55;&#x4E14;&#x6709;&#x5F39;&#x6027;&#x7684;&#x5FAE;&#x670D;&#x52A1;&#x7CFB;&#x7EDF;&#xFF0C;&#x5B83;&#x5C31;&#x5FC5;&#x987B;&#x6709;&#x4E00;&#x5957;&#x62E5;&#x6709;&#x5E7F;&#x6CDB;&#x7684;&#x6784;&#x5EFA;&#x65F6;&#x548C;&#x8FD0;&#x884C;&#x65F6;&#x80FD;&#x529B;&#x7684;&#x5DE5;&#x5177;&#x96C6;&#x6765;&#x5E2E;&#x52A9;&#x7BA1;&#x7406;&#x548C;&#x63A7;&#x5236;&#x3002;&#x4F7F;&#x7528; Spring Cloud&#xFF0C;&#x65E2;&#x80FD;&#x5B9E;&#x73B0;&#x529F;&#x80FD;&#x578B;&#x670D;&#x52A1;&#xFF08;&#x6BD4;&#x5982;&#x7EDF;&#x8BA1;&#x670D;&#x52A1;&#xFF0C;&#x8D26;&#x53F7;&#x670D;&#x52A1;&#x4EE5;&#x53CA;&#x901A;&#x77E5;&#x670D;&#x52A1;&#xFF09;&#xFF0C;&#x53C8;&#x80FD;&#x5B9E;&#x73B0;&#x57FA;&#x7840;&#x67B6;&#x6784;&#x670D;&#x52A1;&#xFF08;&#x6BD4;&#x5982;&#x65E5;&#x5FD7;&#x5206;&#x6790;&#xFF0C;&#x914D;&#x7F6E;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x670D;&#x52A1;&#x53D1;&#x73B0;&#xFF0C;&#x8BA4;&#x8BC1;&#x670D;&#x52A1;&#x7B49;&#xFF09;&#x3002; &#x5355;&#x72EC;&#x4F7F;&#x7528; Spring Cloud &#x5728;&#x5FAE;&#x670D;&#x52A1;&#x65C5;&#x7A0B;&#x4E0A;&#x65E0;&#x6CD5;&#x8D70;&#x5F97;&#x5F88;&#x957F;&#x8FDC;&#xFF0C;&#x5728;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x5FAE;&#x670D;&#x52A1;&#x7ECF;&#x5386;&#x4E2D;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x8FD8;&#x9700;&#x8981;&#x8003;&#x8651;&#x81EA;&#x52A8;&#x5316;&#x90E8;&#x7F72;&#xFF0C;&#x8C03;&#x5EA6;&#xFF0C;&#x8D44;&#x6E90;&#x7BA1;&#x7406;&#xFF0C;&#x8FDB;&#x7A0B;&#x9694;&#x79BB;&#xFF0C;&#x81EA;&#x6108;&#xFF0C;&#x6784;&#x5EFA;&#x6D41;&#x6C34;&#x7EBF;&#x7B49;&#x529F;&#x80FD;&#x3002;&#x5728;&#x8FD9;&#x70B9;&#x4E0A;&#xFF0C;&#x6211;&#x89C9;&#x5F97;&#x5355;&#x72EC;&#x62FF; Spring Cloud &#x548C; Kubernetes &#x6765;&#x6BD4;&#x8F83;&#x4E0D;&#x592A;&#x516C;&#x5E73;&#xFF0C;&#x66F4;&#x516C;&#x6B63;&#x7684;&#x6BD4;&#x8F83;&#x5E94;&#x8BE5;&#x662F; Spring Cloud + Cloud Foundry&#xFF08;&#x6216;&#x8005; Docker Swarm&#xFF09;&#x548C; Kubernetes &#x6765;&#x6BD4;&#x8F83;&#x3002;&#x4F46;&#x662F;&#x90A3;&#x4E5F;&#x8BF4;&#x660E;&#xFF0C;&#x5BF9;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x7AEF;&#x5230;&#x7AEF;&#x7684;&#x5FAE;&#x670D;&#x52A1;&#x7ECF;&#x5386;&#xFF0C;Spring Cloud &#x8FD8;&#x9700;&#x8981;&#x8865;&#x5145;&#x4E00;&#x4E2A;&#x5E94;&#x7528;&#x5E73;&#x53F0;&#xFF0C;&#x5C31;&#x50CF; Kubernetes &#x90A3;&#x6837;&#x3002; Kubernetes &#x662F;&#x517C;&#x5BB9;&#x591A;&#x79CD;&#x8BED;&#x8A00;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x7684;&#x670D;&#x52A1;&#x548C;&#x539F;&#x8BED;&#x662F;&#x901A;&#x7528;&#x7684;&#xFF0C;&#x4E0D;&#x50CF; Spring Cloud &#x5BF9; JVM &#x90A3;&#x6837;&#xFF0C;&#x6CA1;&#x6709;&#x9488;&#x5BF9;&#x4E0D;&#x540C;&#x7684;&#x5E73;&#x53F0;&#x505A;&#x4F18;&#x5316;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x914D;&#x7F6E;&#x662F;&#x901A;&#x8FC7;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x6216;&#x8005;&#x6302;&#x8F7D;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x4F20;&#x9012;&#x7ED9;&#x5E94;&#x7528;&#x7684;&#x3002;&#x5B83;&#x6CA1;&#x6709; Spring Cloud &#x914D;&#x7F6E;&#x63D0;&#x4F9B;&#x7684;&#x90A3;&#x6837;&#x7CBE;&#x5999;&#x7684;&#x914D;&#x7F6E;&#x66F4;&#x65B0;&#x80FD;&#x529B;&#x3002;</p>
<p>Kubernetes &#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x9488;&#x5BF9;&#x5F00;&#x53D1;&#x8005;&#x7684;&#x5E73;&#x53F0;&#x3002;&#x5B83;&#x7684;&#x76EE;&#x7684;&#x662F;&#x4F9B;&#x6709; DevOps &#x601D;&#x60F3;&#x7684;IT&#x4EBA;&#x5458;&#x4F7F;&#x7528;&#x3002;&#x56E0;&#x6B64;&#xFF0C;Java &#x5F00;&#x53D1;&#x8005;&#x9700;&#x8981;&#x5B66;&#x4E60;&#x4E00;&#x4E9B;&#x65B0;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x5E76;&#x66F4;&#x5F00;&#x653E;&#x5F97;&#x5B66;&#x4E60;&#x65B0;&#x7684;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#x7684;&#x65B9;&#x5F0F;&#x3002;&#x4E0D;&#x7BA1;&#x4F7F;&#x7528; MiniKube &#x6765;&#x90E8;&#x7F72;&#x4E00;&#x4E2A; Kubernetes &#x5F00;&#x53D1;&#x5B9E;&#x4F8B;&#x662F;&#x591A;&#x4E48;&#x5F97;&#x5BB9;&#x6613;&#xFF0C;&#x624B;&#x5DE5;&#x5B89;&#x88C5;&#x4E00;&#x4E2A;&#x9AD8;&#x53EF;&#x7528;&#x7684; Kubernetes &#x96C6;&#x7FA4;&#x662F;&#x6709;&#x660E;&#x663E;&#x7684;&#x64CD;&#x4F5C;&#x6210;&#x672C;&#x7684;&#x3002;</p>
<p>Kubernetes &#x4ECD;&#x662F;&#x4E00;&#x4E2A;&#x76F8;&#x5BF9;&#x8F83;&#x65B0;&#x7684;&#x5E73;&#x53F0;&#xFF08;2&#x5E74;&#xFF09;&#xFF0C;&#x5B83;&#x4E5F;&#x8FD8;&#x5728;&#x6D3B;&#x8DC3;&#x5F97;&#x5F00;&#x53D1;&#x548C;&#x751F;&#x957F;&#x4E2D;&#x3002;&#x56E0;&#x6B64;&#x6BCF;&#x4E2A;&#x7248;&#x672C;&#x90FD;&#x4F1A;&#x6709;&#x8BB8;&#x591A;&#x65B0;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x4F7F;&#x5F97;&#x6211;&#x4EEC;&#x5F88;&#x96BE;&#x53BB;&#x4E00;&#x76F4;&#x8DDF;&#x8E2A;&#x3002;&#x597D;&#x6D88;&#x606F;&#x662F;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x5DF2;&#x7ECF;&#x88AB;&#x6B63;&#x89C6;&#xFF0C;API &#x505A;&#x6210;&#x4E86;&#x53EF;&#x6269;&#x5C55;&#x4E14;&#x662F;&#x540E;&#x5411;&#x517C;&#x5BB9;&#x7684;&#x3002;</p>
<h1 id="-">&#x4F7F;&#x7528;&#x968F;&#x673A;&#x7AEF;&#x53E3;</h1>
<p>&#x4E3A;&#x65B9;&#x4FBF;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x591A;&#x4EFD;,&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x7AEF;&#x53E3;&#x4E3A;0,&#x8FD9;&#x6837;&#x7A0B;&#x5E8F;&#x53EF;&#x8FD0;&#x884C;&#x591A;&#x4E2A;&#x5B9E;&#x4F8B;
server.port=0
&#x4F46;&#x8FD9;&#x6837;&#x4F1A;&#x5728;&#x670D;&#x52A1;&#x7BA1;&#x7406;&#x4E0A;&#x770B;&#x5230;&#x7684;&#x662F;&#x540C;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B;&#x540D;,&#x53EF;&#x4EE5;&#x624B;&#x5DE5;&#x8BBE;&#x7F6E;&#x7CFB;&#x7EDF;&#x5B9E;&#x4F8B;ID:
eureka.instance.instance-id=${spring.application.name}:${random.int}</p>
<h1 id="api-">api&#x7F51;&#x5173;</h1>
<p>##&#x3000;&#x79C1;&#x6709;&#x4E91;&#x5F00;&#x6E90;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x5982;&#x4E0B;&#xFF1A;</p>
<p>Kong kong&#x662F;&#x57FA;&#x4E8E;Nginx+Lua&#x8FDB;&#x884C;&#x4E8C;&#x6B21;&#x5F00;&#x53D1;&#x7684;&#x65B9;&#x6848;&#xFF0C; <a href="https://konghq.com/">https://konghq.com/</a>
Netflix Zuul&#xFF0C;zuul&#x662F;spring cloud&#x7684;&#x4E00;&#x4E2A;&#x63A8;&#x8350;&#x7EC4;&#x4EF6;&#xFF0C;<a href="https://github.com/Netflix/zuul">https://github.com/Netflix/zuul</a>
orange,&#x8FD9;&#x4E2A;&#x5F00;&#x6E90;&#x7A0B;&#x5E8F;&#x662F;&#x56FD;&#x4EBA;&#x5F00;&#x53D1;&#x7684;&#xFF0C;<a href="http://orange.sumory.com/">http://orange.sumory.com/</a></p>
<h2 id="-">&#x516C;&#x6709;&#x4E91;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF1A;</h2>
<p>Amazon API Gateway&#xFF0C;<a href="https://aws.amazon.com/cn/api-gateway/">https://aws.amazon.com/cn/api-gateway/</a>
&#x963F;&#x91CC;&#x4E91;API&#x7F51;&#x5173;&#xFF0C;<a href="https://www.aliyun.com/product/apigateway/">https://www.aliyun.com/product/apigateway/</a>
&#x817E;&#x8BAF;&#x4E91;API&#x7F51;&#x5173;&#xFF0C; <a href="https://cloud.tencent.com/product/apigateway">https://cloud.tencent.com/product/apigateway</a></p>
<h2 id="-">&#x81EA;&#x5F00;&#x53D1;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF1A;</h2>
<p>&#x57FA;&#x4E8E;Nginx+Lua+ OpenResty&#x7684;&#x65B9;&#x6848;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;Kong,orange&#x90FD;&#x662F;&#x57FA;&#x4E8E;&#x8FD9;&#x4E2A;&#x65B9;&#x6848;
&#x57FA;&#x4E8E;Netty&#x3001;&#x975E;&#x963B;&#x585E;IO&#x6A21;&#x578B;&#x3002; &#x901A;&#x8FC7;&#x7F51;&#x4E0A;&#x641C;&#x7D22;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x56FD;&#x5185;&#x7684;&#x5B9C;&#x4EBA;&#x8D37;&#x7B49;&#x4E00;&#x4E9B;&#x516C;&#x53F8;&#x662F;&#x57FA;&#x4E8E;&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#xFF0C;&#x662F;&#x4E00;&#x79CD;&#x6210;&#x719F;&#x7684;&#x65B9;&#x6848;&#x3002;
&#x57FA;&#x4E8E;Node.js&#x7684;&#x65B9;&#x6848;&#x3002; &#x8FD9;&#x79CD;&#x65B9;&#x6848;&#x662F;&#x5E94;&#x7528;&#x4E86;Node.js&#x5929;&#x751F;&#x7684;&#x975E;&#x963B;&#x585E;&#x7684;&#x7279;&#x6027;&#x3002;
&#x57FA;&#x4E8E;java Servlet&#x7684;&#x65B9;&#x6848;&#x3002; zuul&#x57FA;&#x4E8E;&#x7684;&#x5C31;&#x662F;&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#xFF0C;&#x8FD9;&#x79CD;&#x65B9;&#x6848;&#x7684;&#x6548;&#x7387;&#x4E0D;&#x9AD8;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;zuul&#x603B;&#x662F;&#x88AB;&#x8BDF;&#x75C5;&#x7684;&#x539F;&#x56E0;&#x3002;</p>
<h2 id="-api-">&#x4F01;&#x4E1A;&#x600E;&#x4E48;&#x9009;&#x62E9;API&#x7F51;&#x5173;</h2>
<h3 id="1-">1.&#x6027;&#x80FD;&#x4E0E;&#x53EF;&#x7528;&#x6027;</h3>
<ul>
<li>&#x4ECE;&#x6027;&#x80FD;&#x4E0A;&#x6765;&#x8BF4;&#xFF0C;&#x9700;&#x8981;&#x8BA9;&#x7F51;&#x5173;&#x589E;&#x52A0;&#x7684;&#x65F6;&#x95F4;&#x6D88;&#x8017;&#x8D8A;&#x77ED;&#x8D8A;&#x597D;&#xFF0C;&#x4E2A;&#x4EBA;&#x89C9;&#x5F97;&#x9700;&#x8981;10ms&#x4EE5;&#x4E0B;&#x3002; &#x7CFB;&#x7EDF;&#x9700;&#x8981;&#x91C7;&#x7528;&#x975E;&#x963B;&#x585E;&#x7684;IO&#xFF0C;&#x5982;epoll&#xFF0C;NIO&#x7B49;&#x3002;&#x7F51;&#x5173;&#x548C;&#x5404;&#x79CD;&#x4F9D;&#x8D56;&#x7684;&#x4EA4;&#x4E92;&#x4E5F;&#x9700;&#x8981;&#x662F;&#x975E;&#x963B;&#x585E;&#x7684;&#xFF0C;&#x8FD9;&#x6837;&#x624D;&#x80FD;&#x4FDD;&#x8BC1;&#x6574;&#x4F53;&#x7CFB;&#x7EDF;&#x7684;&#x9AD8;&#x53EF;&#x7528;&#x6027;&#xFF0C;&#x5982;&#xFF1A;Node.js&#x7684;&#x54CD;&#x5E94;&#x5F0F;&#x7F16;&#x7A0B;&#x548C;&#x57FA;&#x4E8E;java&#x4F53;&#x73B0;&#x7684;RxJava&#x548C;Future&#x3002;</li>
<li>&#x7F51;&#x5173;&#x5FC5;&#x987B;&#x652F;&#x6301;&#x96C6;&#x7FA4;&#x90E8;&#x7F72;&#xFF0C;&#x4EFB;&#x52A1;&#x4E00;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x7684;crash&#x90FD;&#x5E94;&#x8BE5;&#x4E0D;&#x5F71;&#x54CD;&#x6574;&#x4F53;&#x7CFB;&#x7EDF;&#x7684;&#x53EF;&#x7528;&#x6027;&#x3002;</li>
<li>&#x591A;&#x5957;&#x7F51;&#x5173;&#x5E94;&#x8BE5;&#x652F;&#x6301;&#x540C;&#x4E00;&#x7BA1;&#x7406;&#x5E73;&#x53F0;&#x548C;&#x540C;&#x4E00;&#x76D1;&#x63A7;&#x4E2D;&#x5FC3;&#x3002;&#x5982;&#xFF1A; &#x4E00;&#x4E2A;&#x4F01;&#x4E1A;&#x7684;OpenAPI&#x7F51;&#x5173;&#x548C;&#x5185;&#x90E8;&#x5E94;&#x7528;&#x7684;&#x591A;&#x4E2A;&#x7CFB;&#x7EDF;&#x7FA4;&#x7684;&#x4E0D;&#x540C;&#x7684;&#x5FAE;&#x670D;&#x52A1;&#x7F51;&#x5173;&#x53EF;&#x4EE5;&#x5728;&#x540C;&#x4E00;&#x76D1;&#x63A7;&#x4E2D;&#x5FC3;&#x8FDB;&#x884C;&#x76D1;&#x63A7;&#x3002;<h3 id="2-">2.&#x53EF;&#x6269;&#x5C55;&#x6027;&#x3001;&#x53EF;&#x7EF4;&#x62A4;&#x6027;</h3>
</li>
</ul>
<p>&#x4E00;&#x6B3E;&#x4EA7;&#x54C1;&#x603B;&#x6709;&#x4E0D;&#x80FD;&#x6EE1;&#x8DB3;&#x751F;&#x4EA7;&#x9700;&#x6C42;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x6C42;&#x601D;&#x8003;&#x4EA7;&#x54C1;&#x5728;&#x5982;&#x4F55;&#x8FDB;&#x884C;&#x4E8C;&#x6B21;&#x5F00;&#x53D1;&#x548C;&#x7EF4;&#x62A4;&#xFF0C;&#x662F;&#x5426;&#x65B9;&#x4FBF;&#x516C;&#x53F8;&#x56E2;&#x961F;&#x63A5;&#x624B;&#x7EF4;&#x62A4;&#x4EA7;&#x54C1;&#x3002;</p>
<h3 id="3-">3.&#x9700;&#x6C42;&#x5339;&#x914D;&#x5EA6;</h3>
<p>&#x9700;&#x8981;&#x8BC4;&#x4F30;&#x5404;API&#x7F51;&#x5173;&#x5728;&#x9700;&#x6C42;&#x4E0A;&#x662F;&#x5426;&#x80FD;&#x6EE1;&#x8DB3;&#xFF0C;&#x5982;&#xFF1A; &#x5982;&#x679C;&#x662F;OpenAPI&#x5E73;&#x53F0;&#x9700;&#x8981;&#x4F7F;&#x7528;API&#x7F51;&#x5173;&#xFF0C;&#x90A3;&#x4E48;&#x9700;&#x8981;&#x770B;API&#x7F51;&#x5173;&#x5728;&#x5408;&#x4F5C;&#x4F19;&#x4F34;&#x5E94;&#x7528;&#x63A5;&#x5165;&#x3001;&#x5408;&#x4F5C;&#x4F19;&#x4F34;&#x95E8;&#x6237;&#x96C6;&#x6210;&#x3001;&#x8BBF;&#x95EE;&#x6B21;&#x6570;&#x9650;&#x989D;&#x7B49;OpenAPI&#x6838;&#x5FC3;&#x9700;&#x6C42;&#x4E0A;&#x53BB;&#x601D;&#x8003;&#x4EA7;&#x54C1;&#x662F;&#x5426;&#x80FD;&#x6EE1;&#x8DB3;&#x8981;&#x6C42;&#x3002;&#x5982;&#x679C;&#x662F;&#x5FAE;&#x670D;&#x52A1;&#x7F51;&#x5173;&#xFF0C;&#x90A3;&#x4E48;&#x8981;&#x4ECE;&#x5FAE;&#x670D;&#x52A1;&#x7684;&#x8FD0;&#x7EF4;&#x3001;&#x76D1;&#x63A7;&#x3001;&#x7BA1;&#x7406;&#x7B49;&#x65B9;&#x9762;&#x53BB;&#x601D;&#x8003;&#x4EA7;&#x54C1;&#x662F;&#x5426;&#x8DB3;&#x591F;&#x5F3A;&#x5927;&#x3002;</p>
<h3 id="4-">4.&#x662F;&#x5426;&#x5F00;&#x6E90;&#xFF1F;&#x516C;&#x53F8;&#x662F;&#x5426;&#x6709;&#x81EA;&#x5F00;&#x53D1;&#x7684;&#x80FD;&#x529B;&#xFF1F;</h3>
<p>kong&#x662F;&#x57FA;&#x4E8E;ngnix+lua&#x7684;&#xFF0C;&#x4ECE;&#x516C;&#x53F8;&#x7684;&#x89D2;&#x5EA6;&#x6BD4;&#x8F83;&#x96BE;&#x4E8E;&#x627E;&#x5230;&#x80FD;&#x53BB;&#x7EF4;&#x62A4;&#x8FD9;&#x79CD;&#x67B6;&#x6784;&#x4EA7;&#x54C1;&#x7684;&#x4EBA;&#x3002; &#x9700;&#x6C42;&#x8BC4;&#x4F30;&#x5F53;&#x524D;&#x516C;&#x53F8;&#x662F;&#x5426;&#x6709;&#x8FD9;&#x4E2A;&#x80FD;&#x529B;&#x53BB;&#x7EF4;&#x62A4;&#x8FD9;&#x4E2A;&#x4EA7;&#x54C1;&#x3002;
zuul&#x56E0;&#x4E3A;&#x67B6;&#x6784;&#x7684;&#x539F;&#x56E0;&#x5728;&#x9AD8;&#x5E76;&#x53D1;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x6027;&#x80FD;&#x4E0D;&#x9AD8;&#xFF0C;&#x540C;&#x65F6;&#x9700;&#x8981;&#x53BB;&#x57FA;&#x4E8E;&#x7814;&#x7A76;&#x6574;&#x5408;&#x5F00;&#x6E90;&#x7684;&#x9002;&#x914D;zuul&#x7684;&#x76D1;&#x63A7;&#x548C;&#x7BA1;&#x7406;&#x7CFB;&#x7EDF;&#x3002;
orange&#x7531;&#x4E8E;&#x6CA1;&#x6709;&#x88AB;&#x5927;&#x91CF;&#x4F7F;&#x7528;&#xFF0C;&#x540C;&#x65F6;&#x662F;&#x56FD;&#x5185;&#x4E2A;&#x4EBA;&#x5728;&#x5F00;&#x6E90;&#xFF0C;&#x5728;&#x53EF;&#x6301;&#x7EED;&#x6027;&#x548C;&#x793E;&#x533A;&#x8D44;&#x6E90;&#x4E0A;&#x4E0D;&#x591F;&#x4E30;&#x5BCC;&#xFF0C;&#x51FA;&#x4E86;&#x95EE;&#x9898;&#x540E;&#x53EF;&#x80FD;&#x4E0D;&#x5BB9;&#x6613;&#x627E;&#x5230;&#x4EBA;&#x95EE;&#x3002;</p>
</article></div><div style="background-color: #b4b2b2;width: 50px;height:50px;line-height: 50px;text-align: center;position: fixed;bottom: 10px;right: 10px;padding-top:5px;" onclick="document.documentElement.scrollTop = document.body.scrollTop =0;">
  <svg t="1533629773982" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1035" xlink="http://www.w3.org/1999/xlink" width="40" height="40"><defs><style type="text/css">@font-face { font-family: uc-nexus-iconfont; src: url("chrome-extension://pogijhnlcfmcppgimcaccdkmbedjkmhi/res/font_9qmmi8b8jsxxbt9.woff") format("woff"), url("chrome-extension://pogijhnlcfmcppgimcaccdkmbedjkmhi/res/font_9qmmi8b8jsxxbt9.ttf") format("truetype"); }
  </style></defs><path d="M536.255427 195.182354c-7.804756-7.804756-17.966187-11.615549-28.311813-11.615549-9.43693 0-18.874883 3.449565-26.496467 10.163477-2.360767 1.452071-4.356214 3.267417-6.352685 5.262864L218.47792 455.611735c-15.607466 15.60542-15.607466 40.834011 0 56.43943 15.607466 15.607466 41.558511 15.607466 57.167001 0l193.46013-192.733583 0 600.526219c0 22.1423 17.787108 39.927361 39.927361 39.927361 22.140253 0 39.927361-17.785062 39.927361-39.927361L548.959773 319.317583 737.15704 508.422522c15.607466 15.607466 40.469714 15.607466 56.078203 0 15.607466-15.607466 15.425318-40.834011-0.182149-56.441477L536.255427 195.182354 536.255427 195.182354z" p-id="1036" fill="#333"/><path d="M101.784174 143.097092l816.674071 0c22.140253 0 39.925315-17.785062 39.925315-39.927361 0-22.140253-17.784038-39.925315-39.925315-39.925315L101.784174 63.244416c-22.140253 0-39.927361 17.785062-39.927361 39.925315C61.856813 125.31203 79.643921 143.097092 101.784174 143.097092L101.784174 143.097092z" p-id="1037" fill="#333"/></svg>
</div>
</body></html>